Вложенные процедуры с транзакциями - PullRequest
0 голосов
/ 19 октября 2010

У меня следующая проблема. Я должен хранимых процедур (отладочные сообщения с двойным отступом):

CREATE PROC innerProc
AS 
BEGIN
        SELECT 'innerProc 1',@@TRANCOUNT
    BEGIN TRAN
        SELECT 'innerProc 2',@@TRANCOUNT
    ROLLBACK
        SELECT 'innerProc 3',@@TRANCOUNT
END

GO  -----------------------------------------

CREATE PROC outerProc
AS 
BEGIN
        SELECT 'outerProc 1',@@TRANCOUNT
    BEGIN TRAN
        SELECT 'outerProc 2',@@TRANCOUNT
    EXEC innerProc
        SELECT 'outerProc 3',@@TRANCOUNT
    ROLLBACK
        SELECT 'outerProc 4',@@TRANCOUNT
END

GO  -----------------------------------------

EXEC outerProc

Что они делают?

  1. outerProc начинает транзакцию (@@ TRANCOUNT = 1)
  2. выполняет innerProc (@@ TRANCOUNT в начале процедуры = 1)
  3. innerProc начинает другую транзакцию (@@ TRANCOUNT = 2)
  4. innerProc транзакция отката (@@ TRANCOUNT = 0)
  5. И ЕСТЬ ПРОБЛЕМА : @@ TRANCOUNT в начале innerProc не равно @@ TRANCOUNT в конце. Что я делаю неправильно? Это правильный подход?

1 Ответ

0 голосов
/ 19 октября 2010

Я считаю, что вам нужно использовать именованные транзакции, иначе вы убиваете все транзакции при откате на вложенную, даже если она ограничена только внутренним источником

http://msdn.microsoft.com/en-us/library/ms188929.aspx

Дальнейшее чтение: http://msdn.microsoft.com/en-us/library/ms181299.aspx

СДЕЛКА ROLLBACK без имя_пункта сохранения или имя транзакции откатывается к началу сделка. Когда вложение транзакции, это же утверждение откатывает все внутренние транзакции внешняя НАЧАЛО СДЕЛКИ заявление. В обоих случаях ROLLBACK СДЕЛКА уменьшает @@ TRANCOUNT системная функция до 0. ROLLBACK TRANSACTION savepoint_name не имеет декремент @@ TRANCOUNT.

...