簡體   English   中英

C#TransactionScope - L2E

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM