2013-11-08 4 views

ответ

2

Фактическое Commit не происходит до тех пор, пока не будет выведен TransactionScope. Если Commit сбой по какой-либо причине, будет выбрано исключение. Вы должны выхватить это исключение и поместить свою логику для неудачной транзакции в блок Catch. Если исключение не было выбрано, вы должны быть уверены, что Commit был успешным. Если по каким-либо причинам, о которых я не могу думать, вы не доверяете фреймворку, вы всегда можете создать другой масштаб и запросить результаты, чтобы убедиться, что они были применены.

var transactionFailed = false; 
try 
{ 
    using (var tx = new TransactionScope()) 
    { 
     tx.Complete(); 
    } 
} 
catch (TransactionAbortedException ex) 
{ 
    transactionFailed = true; 
    writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message); 

} 
catch (ApplicationException ex) 
{ 
    transactionFailed = true; 
    writer.WriteLine("ApplicationException Message: {0}", ex.Message); 
} 
catch (Exception ex) 
{ 
    transactionFailed = true; 
    writer.WriteLine("Exception Message: {0}", ex.Message); 
} 
+0

FWIW, ApplicationException считается мертвым классом. – StingyJack

0

Да. Просто добавьте переменную и проверьте ее.

bool txExecuted; 

using (var tx = new TransactionScope()) 
{ 
//code 
if (code was OK) 
{ 
    tx.Complete(); 
    txExecuted = true; 
} 

} 
+0

[TransactionScope] (http://msdn.microsoft.com/en -us/library/system.transactions.transactionscope.aspx) не имеет метода Commit. Он имеет метод [Завершить] (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete.aspx), но вызов этого метода не обязательно фиксирует транзакцию. – lightbricko

+0

Я хочу знать, что что-то пошло не так с транзакцией, а не с кодом. – MikeAlike234

+1

@ david2342 - если конец области транзакции достигнут, и Complete не вызван успешно, тогда его откат и переменная не установлены. – StingyJack

0

Касательно документации MSDN https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete(v=vs.110).aspx

// Полный метод совершает сделки. Если выбрано исключение,
// Завершено не вызывается и транзакция откатывается.

метод completeCallback будет вызывать только после того, как sucessfull transactionScope.Complete) исполнения (метод

Таким образом, вы можете использовать функцию:

public bool TryRunTransaction(Action transactionAction) 
    { 
     try 
     { 
      using (var transactionScope = new TransactionScope()) 
      { 
       transactionAction(); 
       transactionScope.Complete(); 
      } 
      return true; 
     } 
     catch (TransactionAbortedException) 
     { 
      return false; 
     } 
    } 
Смежные вопросы