簡體   English   中英

消息3902,級別16,狀態1. COMMIT TRANSACTION請求沒有相應的BEGIN TRANSACTION

[英]Msg 3902, Level 16, State 1. The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION

DECLARE @cnt_inv int,
        @cnt_jrn int, 
        @pl_per varchar(2), 
        @pl_yr  varchar(4), 
        @pl_jrn varchar (6), 
        @pl_inv varchar (6)

IF @@ERROR <> 0
BEGIN
BEGIN TRANSACTION JD_Imp


            IF @cnt_inv > 0 
            BEGIN
            BEGIN TRANSACTION JD_Inv



        COMMIT TRANSACTION JD_Inv; 
                    PRINT N'The Invoice Commits DONE.';
        END

            IF @cnt_jrn > 0 
            BEGIN
            BEGIN TRANSACTION JD_Jrn


        COMMIT TRANSACTION JD_Jrn;  
                    PRINT N'The Journals Commits DONE.';
        END
COMMIT TRANSACTION JD_Imp;
END

您的問題的核心是:

IF @cnt_jrn > 0 
        BEGIN TRANSACTION JD_Jrn

如果@cnt_jrn > 0這樣做只會啟動一個新事務。 無論條件如何,它仍然會執行下面的所有代碼。 因此,如果@cnt_jrn <= 0 ,它將調用commit transaction JD_Jrn而不啟動它。

if具有beginend的主體,則需要將任何多語句的主體括起來。 例如:

IF @cnt_jrn > 0 
BEGIN
        BEGIN TRANSACTION JD_Jrn

        ... code ...
END

但是您在事務中包含單個insertupdate語句,這是不必要的。 SQL操作保證是原子操作,因此如果您跨越多個操作,則只需要一個事務。

問題解決了.....

(a)讓Begin ... END Blocks確實解決了錯誤消息Msg 3902 ..我注意到沒有BEGIN..END塊,以前的程序運行仍然是未提交的

(b)IF @@ ERROR <> 0 BEGIN將始終為true,因此難怪內部的腳本塊未被執行。

(c)由於(b),調試器沒有超過IF語句。

非常感謝Adam。

暫無
暫無

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

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