SqlTransaction и вложенные транзакции - PullRequest
1 голос
/ 05 июля 2011

Можно ли создавать вложенные транзакции с классом SqlTransaction?Если да, то какие правила / ограничения мне необходимо знать?

Ответы [ 3 ]

2 голосов
/ 05 июля 2011

К сожалению, SQL Server игнорирует коммиты на внутренних транзакциях, , как в этой статье MSDN.

Вы можете вкладывать транзакции, но учтите, что поведение может отличаться от ожидаемого.

Ничего не фиксируется до тех пор, пока не совершит самая внешняя транзакция.

Итак, в следующем ...

transaction A
Query A

transaction B
Query B

Commit B
Rollback A

Результат запроса Bфактически не фиксируется в базе данных.

1 голос
/ 03 ноября 2013

Вы можете использовать метод Save(string savePointName) в классе SqlTransaction.Это создаст точку сохранения, к которой вы можете выполнить откат внутри транзакции.Поэтому, если часть вашего кода завершится сбоем, вы вернетесь к предыдущей точке сохранения и начнете заново.

Пример:

SqlTransaction tran = _transaction as SqlTransaction;
tran.Save(savePointName);

, а при неудаче вы сделаете:

tran.Rollback(savePointName);

Вы можете делать это столько раз, сколько захотите.Это решит вашу проблему вложенных транзакций.

0 голосов
/ 05 июля 2011

Да, можно создавать вложенные транзакции.

Например:

transaction A
do action #1
transaction B
do action #2
transaction C
do action #3

rollback transaction B
transaction D
do action #4
commit transaction D
transaction E
do action #5

commit transaction A

с этой последовательностью, только действия 1, 4 и 5 будут фактически выполнены.Вложенные транзакции не имеют никаких ограничений, кроме ограничений самой транзакции, о которых я знаю.Единственное, что нужно понять, это то, что на самом деле ничего не фиксируется, пока не будет зафиксирована транзакция «верхнего уровня» (вершины гнезда).

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