Как SQL Server рассматривает операторы в хранимых процедурах относительно транзакций?

Скажите, что я имею хранимую процедуру, состоящую из нескольких отдельных ВЫБОРОВ, ВСТАВЛЯЮ, ОБНОВЛЕНИЕ и Операторы удаления. Там является не явным, НАЧИНАЮТ СДЕЛКУ / СДЕЛКА ФИКСАЦИИ / логика СДЕЛКИ ОТКАТА.

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

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

Спасибо!

42
задан Tom H 2 July 2010 в 14:22
поделиться

2 ответа

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

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

Однако, если перед вызовом хранимой процедуры вы выполняете BEGIN TRANSACTION, тогда все операторы группируются внутри транзакции и могут быть либо COMMITED, либо 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 операторов (2 оператора EXEC являются операторами, охватываемыми транзакцией, 1 + 5 + 1 + 5 = 12).

33
ответ дан 27 November 2019 в 00:00
поделиться

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

1
ответ дан 27 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: