Каков наилучший способ отката транзакции .net? - PullRequest
3 голосов
/ 21 июня 2010

Этот вопрос связан с моим вопросом: SQL Server и TransactionScope (с MSDTC): Спорадически не удается установить соединение

Я занимаюсь программированием транзакций с использованием .net TransactionScope класс.Если я правильно понимаю, я могу выполнить некоторые операции SQL внутри транзакции, заключив вызовы SQL в блок using ts as new TransactionScope() или используя new TransactionScope(), а затем TransactionScope.Dispose() в конце.

Для фиксациитранзакция, MSDN говорит использовать TransactionScope.Commit().Предположим, что я хочу откатить транзакцию при определенных обстоятельствах, достаточно ли просто вызвать TransactionScope.Dispose() без предварительного вызова метода Commit?Это хорошая практика, или это должно быть сделано как-то иначе?

Ответы [ 4 ]

4 голосов
/ 21 июня 2010

если вы знаете, что хотите выполнить откат, сделайте это явно.Вам не гарантируется, что Dispose выполнит откат (в случае, если вызов завершен, транзакция будет совершена при вызове Dispose)

на ваш вопрос об использовании или новых / Dispose, которые не эквивалентны

using(var ts = new TransactionScope())
{
}

эквивалентно

TransactionScope ts;
try
{
  ts = new TransactionScope();
}
finally
{
  ts.Dispose();
}

, чтобы ответить на ваш следующий вопрос. Нет, если вы позвоните в компанию Dispose, ваша транзакция не будет "зависать", она будет либо зафиксирована, либо откатана.Однако, если вы используете новый / dispose, как вы его написали (без блока finally), вы можете столкнуться с ситуацией, когда dispose не вызывается, когда вы ожидаете, что это произойдет (в случае исключения)

4 голосов
/ 21 июня 2010

Если вы вызываете TransactionScope.Dispose() (либо с помощью , используя блок , либо сами вызывая метод Dispose), он откатит транзакцию, если вы не скажете, что она зафиксировала сначала. Вставляя Transaction.Rollback, вы явно указываете другим программистам, что именно вы намереваетесь делать.

Я бы, вероятно, добавил для ясности, что это действие было нацелено на это обстоятельство. Еще одна вещь, не связанная с явным добавлением команды отката, заключается в том, что вы предполагаете, что метод Dispose всегда будет вести себя таким образом. В действительности это будет , вероятно, так, но делать это предположение рискованно. Всегда лучше явно откатить его назад, а не надеяться, что это будет сделано для вас.

2 голосов
/ 21 июня 2010

Цель класса TransactionScope, на мой взгляд, состоит в том, чтобы сделать транзакции как можно более надежными для разработчика приложения, и с этой целью рекомендовать средства для прерывания транзакции с минимальными затратами. Я полагаю (основываясь на документации TransactionScope), что простое удаление является рекомендуемым средством завершения транзакции, и если оно не было зафиксировано, оно будет откатано.

1 голос
/ 21 июня 2010

Я всегда заключал TransactionScope в блок Using, поскольку он автоматически вызывает Dispose, если есть необработанное исключение, препятствующее успешному завершению транзакции.

...