Предположим, у меня есть хранимая процедура, которая управляет собственной транзакцией.
CREATE PROCEDURE theProc
AS
BEGIN
BEGIN TRANSACTION
-- do some stuff
IF @ThereIsAProblem
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
Если я вызываю эту процедуру из существующей транзакции, она может ОТКАТИТЬ внешнюю транзакцию.
BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION
Как правильно определить область транзакции в хранимой процедуре, чтобы хранимая процедура не откатывала внешние транзакции?





используйте @@ trancount, чтобы узнать, участвуете ли вы уже в транзакции при входе
Синтаксис для этого, вероятно, зависит от базы данных. Но в Transact-SQL вы проверяете @@ TRANCOUNT, чтобы узнать, участвуете ли вы в транзакции. Если да, то вы хотите создать точку сохранения, а в конце вы можете просто пройти через конец функции (полагая, что фиксация или откат произойдут позже) или же откат к вашей точке сохранения.
Дополнительную информацию см. В документации Microsoft по точки сохранения.
Поддержка точек сохранения довольно широко распространена, но я думаю, что механизм (при условии, что он есть) для определения того, что вы в данный момент участвуете в транзакции, будет немного отличаться.
Посмотрите это видео DNR-TV, они много говорят об области видимости транзакции, хотя и обрабатывают ее в коде, а не в sql. надеюсь это поможет.