![](/img/trans.png)
[英]Using parameter in query results in BEGIN / COMMIT mismatch SQLException
[英]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.