Правильно распределенные транзакции в сохраненных процедурах
-
01-07-2019 - |
Вопрос
Предположим, у меня есть хранимая процедура, которая управляет своей собственной транзакцией
CREATE PROCEDURE theProc
AS
BEGIN
BEGIN TRANSACTION
-- do some stuff
IF @ThereIsAProblem
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
Если я вызываю эту процедуру из существующей транзакции, процедура может ОТКАТИТЬ внешнюю транзакцию.
BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION
Как мне правильно ограничить транзакцию в рамках хранимой процедуры, чтобы хранимая процедура не откатывала внешние транзакции?
Решение
Синтаксис для этого, вероятно, зависит от базы данных.Но в Transact-SQL все, что вы делаете, это проверяете @@TRANCOUNT, чтобы узнать, участвуете ли вы в транзакции.Если да, то вы хотите создать точку сохранения, и в конце вы можете просто пройти через завершение функции (полагая, что фиксация или откат произойдут позже) или же выполнить откат к вашей точке сохранения.
Смотрите документацию Microsoft по точки сохранения для большего.
Поддержка точек сохранения довольно широко распространена, но я думаю, что механизм (при условии, что он существует) для определения того, что вы в данный момент участвуете в транзакции, будет немного отличаться.
Другие советы
используйте @@trancount, чтобы узнать, участвуете ли вы уже в транзакции при вводе