Ответ 1
При вложенной транзакции коммит не записывает никаких изменений на диск, кроме транзакции верхнего уровня. Откат, однако, работает независимо от уровня транзакции, поэтому да, он вернет внутреннюю транзакцию.
Представьте себе следующий сценарий:
Я использую SQL Server 2005. У меня есть транзакция, которая вызывает среди других операторов SQL хранимую процедуру, которая также имеет транзакцию внутри. Внешняя транзакция иногда терпит неудачу и откатывается после того, как хранимая процедура вызвана и успешно выполнена.
Мой вопрос: также откат транзакции хранимой процедуры?
При вложенной транзакции коммит не записывает никаких изменений на диск, кроме транзакции верхнего уровня. Откат, однако, работает независимо от уровня транзакции, поэтому да, он вернет внутреннюю транзакцию.
Абсолютно да, транзакция на верхнем уровне будет владеть всеми изменениями данных до тех пор, пока они не будут зафиксированы или откатны.
Однако я бы посоветовал вам внимательно подумать о модели транзакций. Чем больше таких сценариев существует в вашей системе, тем больше у вас проблемы с блокировкой. Также увеличивается вычислительный расход процедуры.
Замечательно, как часто при рационализации SQL я обнаружил, что транзакции были реализованы там, где они просто не требуются. Я призываю вас (и всех, кто работает с транзакциями) тщательно подумать о том, почему вы используете их в каждом контексте, и что произойдет, если транзакция не будет реализована. Просто мой 2c стоит!
Да сохраненная процедура будет отброшена.
Вот общий поток вашего кода:
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
Приветствия, Джон
Я пробовал с началом 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.
Итак, сначала начните изменять данные.
Это полезная статья при понимании транзакций в SQL Server
он предлагает ряд хороших примеров и простых определений.