2010-03-02 48 views
5

是否值得在Linq上使用System.Transactions.TransactionScope實體?C#TransactionScope - L2E

MS documentation上,它表示ObjectContext.SaveChanges()中的SQL調用全部內置到一個事務中。

我們有1個數據庫連接,即文件系統上的本地SQLite數據庫。我們只是想確保我們對數據庫的所有操作都是原子的,我們是否需要TransactionScope? I.E.當我們要求刪除,更新,插入等時,我們希望它們都發生或根本不發生。

回答

3

喬恩,不,你不需要使用TransactionScope。樂觀併發由Linq自動處理。您提供的鏈接中的代碼示例很好地說明了您不必自行回滾事務。我會使用與樣本中相同的代碼:

try 
    { 
     // Try to save changes, which may cause a conflict. 
     int num = context.SaveChanges(); 
     Console.WriteLine("No conflicts. " + 
      num.ToString() + " updates saved."); 
    } 
    catch (OptimisticConcurrencyException) 
    { 
     // Resolve the concurrency conflict by refreshing the 
     // object context before re-saving changes. 
     context.Refresh(RefreshMode.ClientWins, orders); 

     // Save changes. 
     context.SaveChanges(); 
     Console.WriteLine("OptimisticConcurrencyException " 
     + "handled and changes saved"); 
    } 

請注意刷新,重新保存,它處理您的問題。你可以通過在try塊內拋出一個異常來測試。

問候

1

如果您希望在單筆交易中包含多於ObjectContext.SaveChanges(例如讀取要更改的數據以及更改),則需要使用TransactionScope

0

,如果你需要做的理查德說什麼(儘管它似乎相當不可能的),你可以使用下面的代碼:

TransactionManager transactionManager = null; 

try 
{ 
    bool isBorrowedTransaction = ConnectionScope.Current.HasTransaction; 
    transactionManager = ConnectionScope.ValidateOrCreateTransaction(true); 

    //MANY SAVES 

    if (!isBorrowedTransaction && transactionManager != null && transactionManager.IsOpen) 
     transactionManager.Commit(); 
} 
catch (Exception ex) 
{ 
    if (transactionManager != null && transactionManager.IsOpen) 
     transactionManager.Rollback(); 
    log.Error("An unexpected Exception occurred", ex); 
    throw; 
}