簡體   English   中英

交易不回滾,違反 PK

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM