[英]Transaction not rolling back with PK violation
據我所知,如果我們開始事務( begin tran
/ commit tran
),它將完全完成或什么都不做。 但是當我在 TSQL 代碼下執行時,第一個insert
語句有效,而第二個無效。
背景:表A有兩列(ID主鍵,Name varchar),已經有3行數據(ID為1,2,3)。
begin tran
insert into A values (4, 'Tim') -- this works
insert into A values (2, 'Tom') -- this doesn't work because it violates the PK constraint
commit tran
select * from A
這是我的問題:由於第二條insert
語句違反了 PK 約束並且無法提交,所以我認為該事務中的所有內容都應該回滾,因為該事務應該作為一個單元成功或失敗。 但實際上,'Tim' 被添加到 A 中,而 'Tom' 沒有。 這是否違反了事務的自動性?
這取決於您如何處理交易中的錯誤。 如果你抓住了它們,或者你忽略了它們(似乎你忽略了它們),那么事務將繼續並提交。
任何體面的編程語言/框架的“事務管理器”:
如果您在 SQL 提示符下運行這些命令,您可能沒有使用任何事務管理器,這就是為什么您可能故意忽略錯誤並繼續進行,好像一切都很好。
這不是 SQL 服務器中事務的工作方式。 如果出現“語句終止”錯誤,SQL Server 將繼續執行下一條語句。 如果出現“批處理終止”錯誤,事務將中止並回滾。
現在我不想要這種行為了。
所以我在每個存儲過程中寫的第一行是:
SET XACT_ABORT ON;
這告訴 SQL 服務器“語句終止”錯誤應自動升級為“批處理終止”錯誤。 將該語句添加到腳本的開頭,您將看到它現在按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.