事務異常注意事項

2022-02-09 08:57:47 字數 2764 閱讀 2302

主要點:

try...catch不會返回物件錯誤或者字段錯誤等型別的錯誤
當 set xact_abort 為 on 時,如果執行 transact-sql 語句產生執行時錯誤,則整個事務將終止並回滾。

當 set xact_abort 為 off 時,有時只回滾產生錯誤的 transact-sql 語句,而事務將繼續進行處理。如果錯誤很嚴重,那麼即使 set xact_abort 為 off,也可能回滾整個事務。off 是預設設定。

編譯錯誤(如語法錯誤)不受 set xact_abort 的影響。

事務的理解

---建立表table1

if object_id('table1','u') is not null

drop table table1

gocreate table table1

(id int not null primary key,

age int not null check(age>10 and age<50));

go---建立表table2

if object_id('table2','u') is not null

drop table table2

gocreate table table2

(id int not null)

go

1.簡單的事務提交

begin transaction

insert into table1(id,age)

values(1,20)

insert into table1(id,age)

values(2,5)

insert into table1(id,age)

values(2,20)

insert into table1(id,age)

values(3,20)

commit transaction

go---第二條記錄沒有執行成功,其他的都執行成功

select * from table1

所以並不是事務中的任意一條語句報錯整個事務都會回滾,其它的可執行成功的語句依然會執行成功並提交。

----重新開啟乙個回話執行查詢,發現由於存在物件出錯begin catch並沒有收到執行報錯,且事務一直處於開啟狀態,沒有被提交,也沒有執行回滾。

select * from table1

---如果事務已經提交查詢xact_state()的狀態值是0,或者執行dbcc opentran

select xact_state()

dbcc opentran

---手動執行提交或者回滾操作

rollback transaction

try...catch不會返回物件錯誤或者字段錯誤等型別的錯誤
想詳細了解try...catch請參考

3.開啟xact_abort

set xact_abort on

begin transaction

insert into table1(id,age)

values(1,20)

insert into table1(id,age)

values(2,20)

insert into table1(id,age)

values(3,20)

insert into table3

values(1)

commit transaction

set xact_abort off

---事務全部執行回滾操作(物件table3是不存在報錯,但是也回滾所有的提交,跟上面的try...catch的區別)

select * from table1

---查詢是否有開啟事務

select xact_state()

dbcc opentran

未查找到有開啟事務
當 set xact_abort 為 on 時,如果執行 transact-sql 語句產生執行時錯誤,則整個事務將終止並回滾。

當 set xact_abort 為 off 時,有時只回滾產生錯誤的 transact-sql 語句,而事務將繼續進行處理。如果錯誤很嚴重,那麼即使 set xact_abort 為 off,也可能回滾整個事務。off 是預設設定。

編譯錯誤(如語法錯誤)不受 set xact_abort 的影響。

所以我們應該根據自己的需求選擇正確的事務。

**:

事務注意事項

注意事項 1.在需要事務管理的地方加 transactional註解。transactional 註解可以被應用於介面定義和介面方法 類定義和類的 public 方法上。transactional註解只能應用到 public 可見度的方法上。如果你在 protected private 或者 pac...

事務的注意事項

a.乙個功能是否要事務,必須納入設計 編碼考慮。不能僅僅完成了基本功能就ok。b.如果加了事務,必須做好開發環境測試 測試環境也盡量觸發異常 測試回滾 確保事務生效。c.以下列了事務使用過程的注意事項,請大家留意。1.不要在介面上宣告 transactional 而要在具體類的方法上使用 trans...

EJB 事務注意事項

在上篇文章我們提到 當執行多個事務的時候 並且這些事務方式資料庫中的相同資料會出現一系列的併發問題 這些問題彙總起來總共有以下幾類.丟失更新 撤銷乙個事務時,把其他事務已提交的更新資料覆蓋。髒讀 乙個事務讀到另乙個事務為提交的更新資料。不可重複讀 乙個事務讀到另乙個事務已提交的更新資料。幻像讀 乙個...