簡體   English   中英

SQLException - 事務BEGIN / COMMIT不匹配

[英]SQLException - Transaction BEGIN / COMMIT mismatch

您是否遇到過確實具有平衡事務塊的存儲過程的此異常?

我仔細檢查了存儲過程,它只有一個TRANSACTION BEGIN和cooresponding TRANSACTION END

記錄錯誤

SqlException - Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0.  The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION. - Delete failed - stack:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)     at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)     at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)     at System.Data.SqlClient.S ... [Rest of stack trace truncated by logging system]`

附加信息

存儲過程確實包含對另一個存儲過程的EXEC調用。 這里不匹配的事務對會導致錯誤以這種方式浮出水面嗎?

更新事實證明,嵌套存儲過程中存在違反外鍵約束的情況。 外部事務不包含Try / Catch塊並且指定了SET XACT_ABORT ON ,它無法正確處理提交或回滾。 在嘗試回滾之前,還添加了對@@ TransactionCount> 0的檢查

是的,它會的。 每個BEGIN增加@@trancount ,每個提交減少它。 只有當計數達到0時,事務才真正提交。 作為呼叫者,您的程序無法控制此操作。 調用過程的作用是正常運行並平衡BEGIN和COMMIT計數,如果任何被調用的過程有不平衡,您將看到此錯誤。

你確定你沒有產生這個的路徑嗎?

BEGIN TRAN

ROLLBACK TRAN

COMMIT TRAN

是的,你走的是正確的道路。 如果嵌套過程調用創建事務,則它們會影響調用過程。

檢查其他程序

確保你沒有無意中寫過

 return
 commit

代替

 commit
 return

對我來說,這就是問題所在。

在PROCEDURE創建文本之上添加它

SET XACT_ABORT ON;

它將確保如果沒有執行任何操作,則事務將完全中止。

MSDN Doc: http//technet.microsoft.com/en-us/library/ms188792(v = sql.105).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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