Если я создаю хранимую процедуру в SQL и вызываю ее (EXEC spStoredProcedure
) в BEGIN/END TRANSACTION, эта другая хранимая процедура также попадает в транзакцию?
Я не знал, работает ли это как try/catch на С#.
Если я создаю хранимую процедуру в SQL и вызываю ее (EXEC spStoredProcedure
) в BEGIN/END TRANSACTION, эта другая хранимая процедура также попадает в транзакцию?
Я не знал, работает ли это как try/catch на С#.
Да, все, что вы делаете между Begin Transaction и Commit (или откатом), является частью транзакции.
Звучит здорово, благодаря кучу. Я закончил делать что-то вроде этого (потому что я на 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 2005 или выше, вы можете использовать Try... Catch. Здесь более подробно об этом.
@Крис, я этого не знал.
При поиске в Google для получения дополнительной информации я наткнулся на this - вы можете установить "точки сохранения", которые можно отбросить обратно, всей транзакции.
Может быть полезно в этой ситуации.
Как упоминалось Chris и Джеймс, вам нужно быть осторожным при работе с вложенными транзакциями. Существует множество статей по теме транзакций, написанных Дон Петерсон на SQL Server Centra l, я бы рекомендовал прочитать их:
Здесь есть: