解決 “EXECUTE 後的事務計數指示 BEGIN 和 COMMIT 語句的數目不匹配 ”

錯誤提示:

EXECUTE 後的事務計數指示 BEGIN 和 COMMIT 語句的數目不匹配。上一計數 = 0,當前計數 = 1。

 

錯誤原因:

BEGIN 看成計數開始點

COMMIT 和R OLLBACK  看成計數結束點 

每個計數 開始點 和 結束點 要成對匹配

 

情況分析

1. BEGIN 和 COMMIT 中間有RETURN的存在 , 後面的COMMIT(ROLLBACK)不會被執行,所以數目不匹配

Select @rval = 0
BEGIN TRANSACTION

    Insert Into USERS(name , age) VALUES( @name , @age)
    if @@error <> 0
    BEGIN
        Select @rval = -1
        return -- 錯誤示例:這裏返回後,下面的代碼不會被執行,最後的COMMIT會引起不匹配
    END

    Insert Into company(address , tel) values(@address , @tel)
    if @@error <> 0
    BEGIN
        Select @rval = -2
        return -- 錯誤示例:這裏返回後,下面的代碼不會被執行,最後的COMMIT會引起不匹配
    END
COMMIT TRANSACTION

 

 

2.COMMIT前有ROLLBACK , 執行了ROLLBACK 後不使用RETURN,繼續執行後面代碼中如果有COMMIT數目也不匹配。

Select @rval = 0
BEGIN TRANSACTION

    Insert Into USERS(name , age) VALUES( @name , @age)
    if @@error <> 0
    BEGIN
        Select @rval = -1       
    END

    Insert Into company(address , tel) values(@address , @tel)
    if @@error <> 0
    BEGIN
        Select @rval = -2
        ROLLBACK TRANSACTION
        return -- 因爲上面一行代碼使用了ROLLBACK,已經結束了和前面BEGIN的匹配,所以繼續執行下去的COMMIT會造成不匹配,所以這裏必須使用return 不執行最後的COMMIT
    END
COMMIT TRANSACTION

 

解決方法:

1. 只有 BEGIN 與 COMMIT , 中間沒有ROLLBACK,那麼BEGIN和COMMIT之間不能用 RETURN

2. 如果使用了ROLLBACK回滾事務,要檢查BEGIN的匹配數

 

發佈了121 篇原創文章 · 獲贊 17 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章