Вопрос

Если я создам Хранимую процедуру в SQL и вызову ее (EXEC spStoredProcedure) в рамках НАЧАЛЬНОЙ / КОНЕЧНОЙ ТРАНЗАКЦИИ эта другая хранимая процедура также включается в транзакцию?

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

Это было полезно?

Решение

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

Другие советы

Звучит отлично, спасибо большое. Я закончил тем, что делал что-то вроде этого (потому что я на 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

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

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

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

IF @@TRANCOUNT > 0 ROLLBACK

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

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

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

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

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

Здесь есть:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top