Как откатиться, если какое-либо обновление не увенчалось успехом? - PullRequest
4 голосов
/ 27 октября 2010

Я написал транзакцию как:

    BEGIN TRAN

    UPDATE  [Table1]
    SET [Name] = 'abcd'
    WHERE   [ID] = 1

    UPDATE  [Table2]
    SET [Product] = 'efgh'
    WHERE   [ID] = 10

    UPDATE  [Table3]
    SET [Customar] = 'ijkl'
    WHERE   [ID] = 11

Теперь я хочу выполнить откат, если какое-либо ОБНОВЛЕНИЕ не принесло успеха. Например, в Таблице 2, если нет продукта с ID = 10, транзакция должна быть откатана. Как это сделать? Обратите внимание, что я использую SQLServer 2000.

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

SQL Server 2000. Откат не требуется, если вы используете SET XACT_ABORT ON

SET XACT_ABORT ON --to ensure rollback
BEGIN TRAN -- @@TRANCOUNT + 1

UPDATE  [Table1]
SET [Name] = 'abcd'
WHERE   [ID] = 1
IF @@ROWCOUNT = 0 ROLLBACK TRAN

IF @@TRANCOUNT > 0
BEGIN
    UPDATE  [Table2]
    SET [Product] = 'efgh'
    WHERE   [ID] = 10

    IF @@ROWCOUNT = 0 ROLLBACK TRAN
END

IF @@TRANCOUNT > 0
BEGIN
    UPDATE  [Table3]
    SET [Customar] = 'ijkl'
    WHERE   [ID] = 11

    IF @@ROWCOUNT = 0 ROLLBACK TRAN
END

IF @@TRANCOUNT > 0 COMMIT TRAN
1 голос
/ 27 октября 2010

Перед каждым оператором UPDATE вам нужно выполнить BEGIN TRAN, а после каждого вашего оператора UPDATE вам необходимо это сделать -

if @@Error > 0
 THEN 
 BEGIN
   ROLLBACK TRAN
 END
Else
 BEGIN
   COMMIT TRAN
 END
...