Выполнение хранимой процедуры внутри ТРАНЗАКЦИИ BEGIN / END
-
05-07-2019 - |
Вопрос
Если я создам Хранимую процедуру в 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. Здесь более подробно об этом.
@ Крис, я этого не знал.
При поиске дополнительной информации я наткнулся на этот - Вы можете установить «точки сохранения», к которым можно вернуться без отката всей транзакции.
Может быть полезно в этой ситуации.