Выполнение хранимой процедуры внутри BEGIN / END TRANSACTION - PullRequest
36 голосов
/ 07 октября 2008

Если я создаю хранимую процедуру в SQL и вызываю ее (EXEC spStoredProcedure) в транзакции BEGIN / END, попадает ли эта другая хранимая процедура в транзакцию?

Я не знал, работает ли он как try / catch в C #.

Ответы [ 7 ]

39 голосов
/ 08 октября 2008

Да, все , которое вы делаете между началом транзакции и фиксацией (или откатом), является частью транзакции.

12 голосов
/ 08 октября 2008

Звучит отлично, спасибо большое. Я закончил тем, что делал что-то вроде этого (потому что я на 05)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
5 голосов
/ 08 октября 2008

Как упоминал Крис, вы должны быть осторожны с откатом транзакции.

В частности это:

IF @@TRANCOUNT > 0 ROLLBACK

не всегда то, что вы хотите. Вы могли бы сделать что-то вроде этого

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

Таким образом, вызывающий процесс может проверить возвращаемое значение из хранимой процедуры и определить, хочет ли он все равно зафиксировать или продолжать выдавать ошибку.

Причина в том, что COMMIT просто уменьшит счетчик транзакций. Как только он уменьшает счетчик транзакций до нуля, происходит фактическое принятие.

5 голосов
/ 08 октября 2008

Я верю, что в MS SQL Server выполнение хранимых процедур будет происходить внутри транзакции, но будьте очень осторожны с этим. Если у вас есть вложенные транзакции (т.е. транзакция вне хранимой процедуры и другая транзакция внутри хранимой процедуры), откат повлияет на ВСЕ транзакции, а не только на ближайшую вложенную транзакцию.

2 голосов
/ 08 октября 2008

Как уже упоминалось Крис и Джеймс , вы должны быть осторожны при работе с вложенными транзакциями. Существует множество очень хороших статей на тему транзакций, написанных Don Peterson на SQL Server Centra l, я бы рекомендовал прочитать их:

Здесь есть:

1 голос
/ 08 октября 2008

@ Крис, я этого не знал.

При поиске дополнительной информации я наткнулся на this - вы можете установить «точки сохранения», к которым можно вернуться без отката всей транзакции.

Может быть полезно в этой ситуации.

1 голос
/ 08 октября 2008

Да, все вложенные вызовы хранимых процедур включены в объем транзакции. Если вы используете SQL Server 2005 или более позднюю версию, вы также можете использовать Try ... Catch. Здесь более подробно об этом.

...