Правильно ограниченные транзакции в хранимых процессах - PullRequest
4 голосов
/ 19 сентября 2008

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

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

Если я вызываю этот процесс из существующей транзакции, он может откатить внешнюю транзакцию.

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

Как правильно настроить транзакцию в рамках хранимой процедуры, чтобы хранимая процедура не выполняла откат внешних транзакций?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2008

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

Подробнее см. В документации Microsoft по точкам сохранения .

Поддержка точек сохранения довольно широко распространена, но я думаю, что механизм (при условии, что он существует) для определения того, что вы в данный момент находитесь в транзакции, будет немного отличаться.

1 голос
/ 19 сентября 2008

используйте @@ trancount, чтобы узнать, участвуете ли вы уже при вводе

...