关于Entity Framework和事务的问题

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。
2个回答

0
如果您在多个ObjectContext实例中使用TransactionScope,则事务将升级为分布式,整个操作(SomeMethod)仍将被视为原子操作。但是,分布式事务需要额外的NT服务及其依赖项。该服务称为Microsoft Distributed Transaction Coordinator(MSDTC)。此服务必须在所有涉及的服务器上运行(应用程序服务器和数据库服务器)。在网络场景中,服务需要进行一些额外的配置。为了通信,必须在防火墙中打开RPC端口。

但是如果我们谈论的是一个数据库中的表,我的例子就是正确的吗? - gigi
不,它仍然需要 MSDTC。但是,当您管理自己的连接时,这将不是一个问题。有关更多信息,请参见http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/189b2718-c2b0-4290-8517-3cd3da4314fc。 - Pieter van Ginkel

0

最终数据库并不知道数据上下文,因此简单来说:事务规则适用。作为可串行化的事务,将发出和尊重诸如读锁和键范围锁之类的事务锁。像往常一样,死锁可能会导致复杂性风险,但最终它应该能够正常工作。请注意,所有涉及的上下文都应根据需要注册。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接