【问题标题】:How to set transaction level in entity framework?如何在实体框架中设置事务级别?
【发布时间】:2014-08-01 07:03:39
【问题描述】:

我有以下方法

public void UpdateQuantity()
    {
        Sql ss = new Sql();
        M3 m3 = new M3();

        TransactionOptions ff = new TransactionOptions();
        ff.IsolationLevel = IsolationLevel.ReadUncommitted;

        using (TransactionScope dd = new TransactionScope(TransactionScopeOption.Required, ff))
        {                
            try
            {                   
                ss.AddRegion("ALFKI", "SES1"); //step 1
                m3.UpdateAnotherSystem(); //step2
                dd.Complete();                   
            }
            catch (Exception)
            {

            }
        }
    }

public void AddRegion(string customerName, string Deception)
    {
        using (NorthWind context = new NorthWind())
        {

            Region rr = new Region();
            rr.RegionID = 5;
            rr.RegionDescription = "Ssaman";
            context.Regions.Add(rr);
            try
            {

                context.SaveChanges();
            }

            catch (Exception)
            {
                throw;
            }
        }
    }

首先我要更新 Sql server 数据库。之后我要在其他系统上执行另一个更新。如果步骤 2 失败(可能是网络故障),那么我需要反转步骤 1。我放了两个方法在事务范围内调用。我使用实体框架来处理 sql.Entity 框架总是将事务隔离级别设置为已提交读(根据 sql profiler)。

但我的问题是在 context.SaveChanges() 调用后我的目标表被锁定直到事务完成(dd.Complete())。

有没有办法改变实体框架事务隔离级别?(我的实体框架版本是5)。

【问题讨论】:

  • 在您的示例中,您使用了ReadUncommitted,只需指定另一个值
  • @ken2k:没有反映。

标签: c# sql sql-server entity-framework transactions


【解决方案1】:
using (var context = new BloggingContext()) 
        { 
            using (var dbContextTransaction = context.Database.BeginTransaction()) 
            { 
                try 
                { 
                    context.Database.ExecuteSqlCommand( 
                        @"UPDATE Blogs SET Rating = 5" + 
                            " WHERE Name LIKE '%Entity Framework%'" 
                        ); 

                    var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
                    foreach (var post in query) 
                    { 
                        post.Title += "[Cool Blog]"; 
                    } 

                    context.SaveChanges(); 

                    dbContextTransaction.Commit(); 
                } 
                catch (Exception) 
                { 
                    dbContextTransaction.Rollback(); 
                } 
            } 
        } 

【讨论】:

  • 最好在代码中包含一些上下文/解释,因为这会使答案对 OP 和未来的读者更有用。
【解决方案2】:

在事务结束之前,SQL Server 不会释放由于写入而占用的锁。这样可以回滚写入。你对此无能为力。

结束您的事务或接受写入的行仍在使用的事实。通常,这不是问题。对于 HTTP 请求或 WCF 请求中发生的大多数工作,您可能应该有一个上下文、连接和事务。事务不会自行阻塞。

【讨论】:

  • 一个问题:为什么 TransactionScope 有事务隔离级别选项。(SQL Server 直到事务结束才释放由于写入而占用的锁)
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多