繁体   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