Откат в SQL Server 2005 - PullRequest
       10

Откат в SQL Server 2005

0 голосов
/ 09 августа 2011

Мой вопрос: можно ли откатить хранимую процедуру из другой хранимой процедуры в SQL Server 2005?

У меня есть SP1 для вставки значений в одну таблицу и SP2 для вставки значений в другую таблицу.Итак, если при выполнении SP2 возникает какая-либо ошибка, я хочу также откатить SP1.

Пожалуйста, помогите мне решить мою проблему.

Спасибо, Бхарат

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Вам нужно обернуть оба вызова в одну транзакцию.

если вы вызываете их в SQL, то это путь или использование более полной версии, как в другом ответе, который был дан 7 минут назад gbn.

create proc doall as
BEGIN TRY
     BEGIN TRAN
     EXECUTE SP1
     EXECUTE SP1
     COMMIT TRAN
END TRY

BEGIN CATCH
     ROLLBACK TRAN
END CATCH;

если вы вызываете SP из другого источника , например из программы, отличной от SQL, вам нужно настроить внешнюю транзакцию, используя службу координатора распределенных транзакций Microsoft (MSDTC).

В зависимости от используемого вами API вы настраиваете транзакцию в Code, а затем фиксируете и откатываете в коде, в зависимости от условий.

например, в .net вы можете использовать пространство имен System.Transactions для создания распределенных транзакций.

В основной программе

var tran = new System.Transactions.Transaction();

.
.
.

in one piece of code doe a db call (and pass the tran object to the sql connection) so it enlists in the transaction... if it fails - abort the transaction (trans.Rollback())

.
.
.
. 

in another piece of code do another db call (and pass the tran object to the sql connection) so it enlists in the transaction... if it fails - abort the transaction (trans.Rollback())
.
.
.
later...
if both pieces of code succeed commit the transaction 

Этот является хорошим введением в это пространство имен, если вы используете .net

0 голосов
/ 09 августа 2011

Вам нужна хранимая процедура-оболочка для управления транзакцией.

@@ TRANCOUNT при входе и выходе из хранимой процедуры должны быть одинаковыми, в противном случае вы получите ошибку 266. Поэтому вы не можете выйти из SP1, например, запустив TXN.

Я предполагаю, что SP1 и SP2 могут называться автономными, поэтому вам нужна вложенная транзакция. Тогда вы нажмете ту же ошибку, потому что

  • BEGIN TRAN добавляет один к @@ TRANCOUNT
  • COMMIT TRAN вычитает одно из @@ TRANCOUNT
  • ROLLBACK обнуляет @@ TRANCOUNT

Так что вы все равно можете получить ошибку 266.

Мой ответ здесь объясняет больше об этом, включая вложение, подавление ошибок 266 и т. Д .: Вложенные хранимые процедуры, содержащие шаблон TRY CATCH ROLLBACK?

Так что в вашем случае вам нужно нечто подобное

CREATE PROCEDURE Wrapper
AS
SET XACT_ABORT, NOCOUNT ON

DECLARE @starttrancount int

BEGIN TRY
    SELECT @starttrancount = @@TRANCOUNT

    IF @starttrancount = 0
        BEGIN TRANSACTION

    EXEC SP1
    EXEC SP2

    IF @starttrancount = 0 
        COMMIT TRANSACTION
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...