2010-10-23 61 views
3
 public void SomeMethod1() 
     { 
      using (TemplateEntities ctx = new TemplateEntities()) 
      { 
       //do something in this ctx 
      } 
     } 

     public void SomeMethod2() 
     { 
      using (TemplateEntities ctx = new TemplateEntities()) 
      { 
       //do something else in this ctx 
      } 
     } 

     public void SomeMethod() 
     { 
      using (TemplateEntities ctx = new TemplateEntities()) 
      { 
       using (TransactionScope tran = new TransactionScope()) 
       { 
        SomeMethod1(); 
        SomeMethod2(); 
        var itemToDelete= (from x in ctx.Xxx 
            where x.Id==1 
            select x).Single(); 
        ctx.Xxx.DeleteObject(itemToDelete); 
        ctx.SaveChanges(); 
        tran.Complete(); 
       } 
      } 
     } 

即使有更多的上下文,SomeMethod中会发生什么? 我正在使用POCO。关于实体框架和事务的问题

回答

0

如果使用具有多个ObjectContext实例的TransactionScope,事务将被提升为分布式,并且整个操作(SomeMethod)仍将作为原子处理。但分布式事务需要额外的NT服务及其依赖。该服务称为Microsoft分布式事务处理协调器(MSDTC)。此服务必须在所有涉及的服务器(应用程序服务器和数据库服务器)上运行。在网络场景服务中需要一些额外的配置。对于通信RPC端口必须在防火墙中打开。

+0

但是,如果我们正在谈论与一个数据库表是正确的我的例子? – gigi 2010-10-23 20:58:12

+0

不,它仍然需要MSDTC。但是,当您管理自己的连接时,这不会成为问题。有关更多信息,请参见http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/189b2718-c2b0-4290-8517-3cd3da4314fc。 – 2010-10-23 21:45:43

0

最终,数据库并不知道数据上下文,因此简单地说:应用交易规则。作为一个可序列化的事务,诸如读锁和键范围锁之类的东西将被颁发和兑现。与往常一样,存在死锁复杂化的风险,但最终应该起作用。请注意,所有涉及的上下文应根据需要征用。