![](/img/trans.png)
[英]The COMMIT TRANSACTION request has no corresponding 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
具有begin
和end
的主體,則需要將任何多語句的主體括起來。 例如:
IF @cnt_jrn > 0
BEGIN
BEGIN TRANSACTION JD_Jrn
... code ...
END
但是您在事務中包含單個insert
和update
語句,這是不必要的。 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.