【问题标题】:C# TransactionScope - L2EC# TransactionScope - L2E
【发布时间】:2010-03-02 14:51:59
【问题描述】:

在 Linq to Entities 上使用 System.Transactions.TransactionScope 是否值得?

MS documentation 上,它说 ObjectContext.SaveChanges() 中的 SQL 调用都在内部汇总到一个事务中。

我们有 1 个数据库连接,即文件系统上的本地 SQLite 数据库。我们只是想确保我们对数据库的所有操作都是原子的,我们需要 TransactionScope 吗? I.E.当我们调用一些删除、更新、插入等操作时,我们希望它们全部发生或根本不发生。

【问题讨论】:

    标签: c# .net transactions linq-to-entities transactionscope


    【解决方案1】:

    乔恩,不,您不需要使用 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 块中抛出异常来测试这一点。

    最好的问候

    【讨论】:

      【解决方案2】:

      如果您想在单个事务中包含多个ObjectContext.SaveChanges(例如读取您要更改的数据以及更改),那么您需要使用TransactionScope

      【讨论】:

        【解决方案3】:

        如果您需要按照 Richard 所说的进行操作,可以使用以下代码(尽管这似乎不太可能):

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多