Подтвердить что ты не робот

Вложенные транзакции на сервере Sql

Представьте себе следующий сценарий:

Я использую SQL Server 2005. У меня есть транзакция, которая вызывает среди других операторов SQL хранимую процедуру, которая также имеет транзакцию внутри. Внешняя транзакция иногда терпит неудачу и откатывается после того, как хранимая процедура вызвана и успешно выполнена.

Мой вопрос: также откат транзакции хранимой процедуры?

4b9b3361

Ответ 1

При вложенной транзакции коммит не записывает никаких изменений на диск, кроме транзакции верхнего уровня. Откат, однако, работает независимо от уровня транзакции, поэтому да, он вернет внутреннюю транзакцию.

Ответ 2

Абсолютно да, транзакция на верхнем уровне будет владеть всеми изменениями данных до тех пор, пока они не будут зафиксированы или откатны.

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

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

Ответ 3

Да сохраненная процедура будет отброшена.

Вот общий поток вашего кода:

BEGIN TRY

    BEGIN TRANSACTION

    EXEC SotredProcedureName

    --Do some other activity

    COMMIT TRANSACTION
END TRY
BEGIN CATCH

    --IF an error occurs then rollback the current transaction, which includes the stored procedure code.
    ROLLBACK TRANSACTION

END CATCH

Приветствия, Джон

Ответ 4

Я пробовал с началом tran и совершил внутри хранимой процедуры say usp_test.
Exec эти sp с другим запросом, как показано ниже

update x set name='xxx'
select * from x---contains 'xxx'
begin tran
update x set name='yyy'
select * from x---contains 'yyy'
exec usp_test
select * from x---contains 'zzz' inside the sp
rollback tran

Во время выполнения вышеуказанного имени запроса в таблице x должно быть "xxx", а не "zzz", поскольку первый запуск tran отменен даже для транзакции sp tran.
Итак, сначала начните изменять данные.

Ответ 5

Это полезная статья при понимании транзакций в SQL Server

он предлагает ряд хороших примеров и простых определений.

SQL-Server-Transactions-and-Error-Handling