如何在实体框架中设置事务级别

本文关键字:设置 事务 框架 实体 | 更新日期: 2023-09-27 18:08:01

我有下面的方法

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工作。实体框架总是将事务隔离级别设置为已读提交(根据sql分析器)。

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

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

如何在实体框架中设置事务级别

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

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

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