TransactionScope ожидает вызова своего метода Complete следующим образом. В противном случае транзакция не будет выполнена.
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete();
}
Не была ли более успешной реализация, предполагающая успех? Это означало бы, что в стандартном случае (успех) потребуется меньше кода.
В случае исключения или вызова метода, такого как "Откат" (этот метод в настоящее время не существует), транзакция может быть отменена.
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
if(problemOccurred)
{
scope.Rollback();
}
}
Обратите внимание, что флаг "Описанная проблема" требуется только в тех случаях, когда проблема не привела к исключению. В этом случае откат будет выполняться автоматически.
Мне интересно узнать, почему эта реализация была использована.
Обновление:. Несколько ответов до сих пор утверждали, что блок try-catch был бы необходим, если бы использовалась реализация, которую я описал. Это не тот случай. Транзакция автоматически откатывается, когда исключение не обрабатывается в блоке использования. Это касается как существующей реализации, так и той, которую я описал. Дополнительную информацию см. В разделе "Завершение области транзакции" здесь.
Обновление 2: Я, наконец, понимаю, что объясняется в ответах. Это не языковая конструкция, которая могла быть интерпретирована любым способом, который разработчики языка считали нужным - это реализация шаблона IDisposable. Без вызова для завершения кода в методе Dispose не было бы известно, будет ли он вызван в результате успешного выполнения кода в используемом блоке или из-за возникновения исключения. Я представлял что-то похожее на следующее, где и транзакция, и откат являются ключевыми словами.
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
Это, конечно, представляет проблемы, если параметры транзакции должны быть переданы TransactionScope.