[英]C# TransactionScope - L2E
在Linq to Entities上使用System.Transactions.TransactionScope是否值得?
在MS文檔中 ,它說ObjectContext.SaveChanges()中的SQL調用都在內部集成到一個事務中。
我們有1個數據庫連接,即文件系統上的本地SQLite數據庫。 我們只是想確保我們對數據庫的所有操作都是原子的,我們需要TransactionScope嗎? IE當我們調用一些刪除,更新,插入等時,我們希望它們全部發生或根本不發生。
Jon,不,你不需要使用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塊中拋出異常來測試它。
最好的祝福
如果要在單個事務中包含多個ObjectContext.SaveChanges
(例如,您要更改的數據讀取以及更改),則需要使用TransactionScope
。
如果你需要做理查德所說的話,你可以使用下面的代碼(雖然看起來不太可能):
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.