2016-10-12 40 views
0

我有這樣多TransactionScope.Complete()在使用

try 
{ 
    MyModel model = repo.GetData(); 
    if(model == null) 
    { 
     return model; 
    } 
    else 
    { 
     MyResponse response = checkData(); 
     if(response) 
     { 
      return model; 
     } 

     UpdateData(); 
    } 
} 
catch(Exception e) 
{ 
    .... 
} 
return model; 

我想補充TransactionScope這樣的代碼。

try 
{ 
    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
    { 
     MyModel model = repo.GetData(); 
     if(model == null) 
     { 
      return model; 
     } 
     else 
     { 
      MyResponse response = checkData(); 
      if(response) 
      { 
       return model; 
      } 

      UpdateData(); 
     } 
     ts.Complete(); 
    } 
} 
catch(Exception e) 
{ 
    .... 
} 
return model 

我想問問,是不是好,如果我有多個return語句代碼達到ts.Complete()過嗎?因爲TransactionScope位於try塊內,所以我不能在finally塊中將ts設置爲null。

回答

1

要回答你的問題:是否可以返回之前trans.Complete()? - 是的。交易不會被提交,更改將不會被應用。這就是它的工作原理。

即使發生異常(或返回),using語句也會在任何會話中運行.Dispose()。

當處置一個事務時,如果調用了trans.Complete(),它將被提交,如果沒有調用,則不會應用更改。

關於使用聲明: What is the C# Using block and why should I use it?

關於Transaction.Dispose(): https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.dispose(v=vs.110).aspx