Правильно распределенные транзакции в сохраненных процедурах

StackOverflow https://stackoverflow.com/questions/97857

Вопрос

Предположим, у меня есть хранимая процедура, которая управляет своей собственной транзакцией

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, чтобы узнать, участвуете ли вы уже в транзакции при вводе

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