2014-06-11 17 views
0

我有以下方法如何在实体框架中设置事务级别?

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数据库。之后即时通讯将执行对其它system.If第二步另一个更新失败(可以是网络故障)然后我需要反向步骤1。因此,我把两个方法调用在transactionscope中。我使用实体框架来处理sql.Entity框架总是将事务隔离级别设置为读提交(根据sql分析器)。

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

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

+0

在你的例子中,你使用了'ReadUncommitted',只是指定了另一个值 – ken2k

+0

@ ken2k:它没有反映出来。 – Renushi

回答

0

SQL Server不会释放由于写入而导致的锁定,直到事务结束。这样可以回滚写入。你无法对此做任何事情。

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

+0

一个问题:他们为什么TransactionScope具有事务隔离级别选项(SQL Server不会释放由于直到事务结束而写入的锁) – Renushi

+0

隔离级别以很大的方式影响读取。 – usr

+0

锁定意味着我甚至无法在交易中阅读。 – Renushi

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

最好在代码中包含一些上下文/解释,因为这会使OP对未来的读者更有用。 – EJoshuaS