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

Привет, мое текущее понимание вложенных транзакций в TSQL заключается в том, что если у вас есть несколько транзакций (несколько транзакций, вложенных внутри одной "внешней" транзакции), все транзакции должны быть совершены (при этом "внешняя" транзакция является последней ) для любых изменений в базе данных. Если количество коммитов меньше количества открытых транзакций, то никаких изменений, связанных с какой-либо транзакцией, не производится. Является ли это правильным обзором работы вложенных транзакций?

Ответ 1

Ваше описание COMMIT верное.

У Kalen Delaney есть статья, описывающая тот же тип поведения, который вы описываете.

Однако, как обсуждалось в статье Калена, ROLLBACK внутри вложенной транзакции откатит всю внешнюю транзакцию, а не только внутреннюю транзакцию, в которой происходит откат.

Обратите внимание на следующие результаты:

BEGIN TRAN
SELECT @@trancount
BEGIN TRAN
SELECT @@trancount
BEGIN TRAN
SELECT @@trancount

ROLLBACK TRAN
SELECT @@trancount

Это описано в статье MSDN, Nesting Transactions:

РАБОТА ROLLBACK или инструкцию ROLLBACK TRANSACTION, которая не имеет имя транзакции откатывает все вложенные транзакции и декременты @@TRANCOUNT до 0. ROCLBACK TRANSACTION, которая использует транзакцию имя самой внешней транзакции в наборе вложенных транзакций откатывает все вложенные транзакции и уменьшает @@TRANCOUNT на 0. Когда вы не уверены, что вы уже находитесь в транзакции, SELECT @@TRANCOUNT, чтобы определить, равно ли оно 1 или больше. Если @@TRANCOUNT равно 0, вы не находятся в транзакции.

Ответ 2

Короче говоря, ваш ответ - да. Из Вложенные транзакции:

Собственные внутренние транзакции игнорируются базой данных SQL Server Двигатель. Сделка совершается или откатывается на основании действие, предпринятое в конце самой внешней транзакции. Если внешняя транзакция совершена, внутренние вложенные транзакции также совершено. Если внешняя транзакция откатывается назад, то все внутренние транзакции также откатываются, независимо от того, внутренние транзакции были индивидуально совершены.

Что касается ROLLBACks, разрешено только ROLLBACK всю внешнюю транзакцию.