關於sqlserver 事物的運用
概述:以往在sql2000下處理異常通常的方式比較繁瑣,sql2005版本以上加入了begin try end/try begin cath end catch 是異常的捕獲稍微顯得簡單一些,根據我的測試,將我對sql事物的處理做一下整理;本文分為三個部分來描述,重點講述對sql2005以上版本對事物的處理,sql2000略過了。第一部分:針對普通的事物描述。第二部分針對自定義錯誤的丟擲以及回滾。第三部分:巢狀事物以及巢狀的儲存過程的回滾;
第一部分:針對普通的事物描述
1》 基本語法描述
begin tran
select 1/0
insert into table1 select 1
commit tran
不能達到要麼全部執行成功,要麼就全部回滾的機制,為什麼?因為沒有進行異常的捕獲,如何進行異常的捕獲,通常有以下三種方式如果這樣是這樣執行,select 1/0是明顯的錯誤,但資料1還是被插入到table1中,
1》利用@@error每執行一條語句進行判斷@error的狀態,其**如下
begin tran
select 1/0
if@@error>0gotoerr
insertinto table1 select 1
commit tran
return
err:
rollback tran
小結:利用
@@error
對執行的結果進行判斷,如果錯誤,跳轉到
err標籤,並回滾
2》利用set
xact_abort
on語句如下
set xact_abort on
begin tran
select 1/0
insert into t_test select 12
commit tran
小結:當開啟了set
xact_abort
on 之後只要在程式內部發生錯誤都會自動執行回滾
3》利用begin try end try /begin catch endcatch
begin try
begin tran
select 1/0
insertintot_test select 12
commit tran
end try
begin catch
declare @err varchar(30)=error_message()
rollback tran
raiserror( @err,17, 1)
end catch
小結:(17,1),是定義的錯誤等級,我隨便搞的,可以通過系統特性取得這些值, begin catch /end catch主要是對執行語句執行的異常部分進行捕獲,並人為的丟擲異常,捕獲的內容有
error_message()錯誤的資訊;
error_number(),錯誤的行數;
error_severity(),錯誤的等級;
error_state(),錯誤的狀態;
error_procedure(),錯誤的儲存過程(含巢狀的儲存過程)
第一部分的小結:
通過以上的三種方式都可以實現異常的捕獲,而進行事物的回滾,三種方式各有什麼優劣呢,@@rowcount不用想,很煩人,我認為沒有什麼優勢
set abort on 很好,一句話就可以解決,出現的異常,無論是執行的異常,還是自定義的異常(下一部分描述),都可以處理,但對於巢狀的異常輸出沒有好的解決方案
beign try end try方式語法上稍微繁瑣點,但對於異常的輸出,特別是巢狀的儲存過程的異常輸出的處理上更加的詳盡些(第三部分講述)
關於 sqlserver 的事物回滾
例 先進行標記事物的開始 begin transaction 進行表的操作,例如插入 修改等。在進行過程中,如果發生錯誤則回滾事物 rollback transaction 若事物結束,則提交事物 commit 在事物過程中通常用 error 語句是否發生錯誤 例如,插入幾條資料,後面的資料主鍵重複...
SqlServer中的事物彙總
在乙個mis系統中,沒有用事務那就絕對是有問題的,要麼就只有一種情況 你的系統實在是太小了,業務業務邏輯有只要一步執行就可以完成了。因此掌握事務處理的方法是很重要,進我的歸類在.net中大致有以下4種事務處理的方法。大家可以參考一下,根據實際選擇適當的事務處理。1 sql事務 sql事務是使用sql...
關於mysql裡面的事物 mysql 事物
mysql之事物詳解 一 事務定義 事務 乙個最小的不可再分的工作單元 通常乙個事務對應乙個完整的業務 例如銀行賬戶轉賬業務,該業務就是乙個最小的工作單元 乙個完整的業務需要批量的dml insert update delete 語句共同聯合完成 事務只和dml語句有關,或者說dml語句才有事務。這...