[ERROR]The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION

程式在呼叫Commit時,居然發生「The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION」的錯誤~ 到底是怎麼一回事呢?

前陣子幫同事查問題時,程式的執行中,居然發生了以下的錯誤,

at System.Data.SqlClient.SqlConnection.OnError  <System.Data.SqlClient.SqlException>
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
[ SqlException.Number : 3902, SqlException.LineNumber : 1, SqlException.State : 1 ]
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, TdsParserState state)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, TdsParserState state)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior run, SqlCommand cmdHandler, SqlDataReader dataStream)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior run)
   at System.Data.SqlClient.SqlInternalConnection.ExecuteTransaction(String sqlBatch, String method)
   at System.Data.SqlClient.SqlConnection.ExecuteTransaction(String sqlBatch, String method)
   at System.Data.SqlClient.SqlTransaction.Commit()

 

還蠻奇怪的,於是問同事說,除了程式中的connection有起交易外,呼叫的Store Procedure有起交易嗎?

查了一下,程式呼叫的SP中,都沒有BEGIN TRAN呀~

同事懷疑是因為程式中呼叫Web Service所導致的,後來把那段程式mark起來還是一樣的狀況!

於是用SQL Server Profiler錄看看到底是什麼狀況,結果發現程式執行到最後,TransactionID欄位的值不見了,如下圖,

image

 

當下覺得怪怪的,想說把那支SP拿來執行一下!

果然就發現了問題,就是因為程式執行的SP中會發生錯誤,這時因為「SET XACT_ABORT ON」,所以在交易裡,如果有發生錯誤的話,就會自動Rollback。

但是那個錯誤,在.NET程式中並沒有被Catch到,.NET程式以為這個SP執行是正確的,所以.NET程式要再呼叫Commit就會出現「The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION」的錯誤!

所以下次如果在程式中有起交易,而最後要Commit發生了一樣的錯誤,請記得檢查是不是執行SQL發生錯誤,而沒有被程式Catch到哦!

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^