Сообщение 3902, уровень 16, состояние 1. Запрос COMMIT TRANSACTION не имеет соответствующей BAGIN TRANSACTION - PullRequest
0 голосов
/ 22 октября 2011
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

Ответы [ 2 ]

2 голосов
/ 22 октября 2011

Суть вашей проблемы заключается в следующем:

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 гарантированно будут атомарными, поэтому вам нужна транзакция, только если вы выполняете несколько операций.

0 голосов
/ 23 октября 2011

Проблема решена .....

(a) Наличие блоков Begin ... END решило сообщение об ошибке Msg 3902 .. Я заметил, что без блоков BEGIN..END предыдущие прогоны процедуры будут по-прежнему зависать незафиксированными

(b) IF @@ ERROR <> 0 BEGIN всегда будет истинным, поэтому неудивительно, что блок сценария внутри не выполнялся.

(c) Отладчик не двигался дальше оператора IF из-за (b).

Большое спасибо, Адам.

...