Как SQL Server обрабатывает операторы внутри хранимых процедур в отношении транзакций? - PullRequest
41 голосов
/ 12 апреля 2010

Скажем, у меня есть хранимая процедура, состоящая из нескольких отдельных операторов SELECT, INSERT, UPDATE и DELETE.Не существует явной логики BEGIN TRANS / COMMIT TRANS / ROLLBACK TRANS.

Как SQL Server будет обрабатывать эту хранимую процедуру с точки зрения транзакций?Будет ли неявная связь для каждого утверждения?Или будет одна транзакция для хранимой процедуры?

Кроме того, как я мог узнать это самостоятельно, используя T-SQL и / или SQL Server Management Studio?

Спасибо!

Ответы [ 2 ]

33 голосов
/ 12 апреля 2010

Будет только одно соединение, это то, что используется для запуска процедуры, независимо от количества команд SQL в хранимой процедуре.

, поскольку в хранимой процедуре нет явного BEGIN TRANSACTION, каждый оператор будет выполняться сам по себе без возможности откатить какие-либо изменения в случае ошибки.

Однако, если вы перед вызовом хранимой процедуры выполняете BEGIN TRANSACTION, все операторы группируются в транзакции и могут после выполнения хранимой процедуры быть либо COMMITted, либо ROLLBACKed.

Из хранимой процедуры вы можете определить, выполняете ли вы внутри транзакции, проверив значение системной переменной @@ TRANCOUNT (Transact-SQL) . Ноль означает, что транзакции отсутствуют, все остальное показывает, сколько вложенных уровней транзакций у вас есть. В зависимости от версии вашего сервера sql вы можете использовать XACT_STATE (Transact-SQL) .

Если вы делаете следующее:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

все в процедуре покрыто транзакцией, все 6 операторов (EXEC - оператор, охватываемый транзакцией, 1 + 5 = 6). Если вы сделаете это:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1
EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

все в двух вызовах процедур охватывается транзакцией, все 12 операторов (оба оператора EXEC являются оператором, охватываемым транзакцией, 1 + 5 + 1 + 5 = 12).

1 голос
/ 12 апреля 2010

Вы можете выяснить это самостоятельно, создав небольшую хранимую процедуру, которая делает что-то простое, например, вставить запись в тестовую таблицу. Тогда начни Чан; запустить sp_test; откатить; Новая запись есть? Если это так, то SP игнорирует внешнюю транзакцию. Если нет, то SP - это просто еще один оператор, выполняемый внутри транзакции (что, я уверен, так и есть).

...