Вложенные транзакции в Sql Server - PullRequest
32 голосов
/ 09 февраля 2009

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

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

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

Ответы [ 5 ]

38 голосов
/ 09 февраля 2009

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

8 голосов
/ 09 февраля 2009

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

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

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

2 голосов
/ 09 февраля 2009

Да, хранимая процедура будет откатана.

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

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

Ура, Джон

1 голос
/ 27 июля 2013

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

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

SQL-Server-Транзакции-и-обработки ошибок

1 голос
/ 04 декабря 2009

Я пытался с помощью start tran и commit внутри хранимой процедуры сказать usp_test.
Выполните эти 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», так как первый start trans откатывается даже при передаче sp trans.
Итак, сначала начните с изменения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...