2009-02-09 3 views
28

Представьте себе следующий сценарий:Вложенные транзакции в Sql Server

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

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

ответ

36

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

+6

Откат откатить -все- сделки, а не только предыдущий. EG: http://www.emoreau.com/Entries/Articles/2011/02/EricMoreau1.gif –

+4

@ Pure.Krome правильный. Вложенные транзакции не будут делать то, что вы хотите. См. [Серии SQL Server Myth a Day] (http://www.sqlskills.com/blogs/paul/post/A-SQL-Server-DBA-myth-a-day-%282630%29-nested-transactions- are-real.aspx) –

+0

Подтверждение: http://technet.microsoft.com/en-us/library/ms189336(v=sql.90).aspx – Vadzim

2

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

Вот общий поток кода:

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 

Cheers, Джон

7

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

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

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

1

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

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 

При выполнении выше имя запроса в таблице х должен быть «ххх» его не «ZZZ», так как первый начинают тран rollbacked даже зр Tran фиксации.
Итак, сначала начните управлять данными.

Смежные вопросы