EF Transactions MSDTC?
本文关键字:MSDTC Transactions EF | 更新日期: 2023-09-27 18:06:49
我在EF和事务处理方面遇到了一点问题。
I'm try to do this:
using(TransactionScope scope = new TransactionScope())
{
using(MyEntities model = new MyEntities())
{
MyT thing = new MyT{ Value1 = "bla", Value2 = "bla2", Value3 = "foo" };
model.MyT.AddObject(thing);
model.SaveChanges();
thing.Value4 = Service.Call("bar");
// this call causes an exception in MSDTC
model.SaveChanges();
scope.Complete();
}
}
我这样做的原因是因为我想做一个插入到数据库,所以MyT有一个唯一的id,我传递给服务,当我进行调用,然后从服务中获得一个唯一的ref和状态,描述调用期间发生了什么,然后我需要追加到记录。
我的理解是,在单个事务中,您只能更新一次记录/进行插入调用,但您不能同时进行,因为这会出于某种原因产生问题…我曾经在MSDN上发表过一篇文章,解释了为什么不能这样做的一些逻辑原因(可能与锁有关)。
所以我的问题是如何绕过这个,但要确保在任何这些调用的任何失败的情况下,我仍然可以回滚
当你在事务范围内建立多个数据库连接时,该事务将从本地事务提升为分布式事务,除非你显式地使用相同的数据库连接。
当事务被提升时,它需要MSDTC服务来管理事务,因此如果该服务不可用,它将抛出异常。
像这样:
using(TransactionScope scope = new TransactionScope())
{
using(MyEntities model = new MyEntities())
{
model.Connection.Open();
MyT thing = new MyT{ Value1 = "bla", Value2 = "bla2", Value3 = "foo" };
model.MyT.AddObject(thing);
model.SaveChanges();
thing.Value4 = Service.Call("bar");
// this call shouldn't cause anymore an exception in MSDTC
model.SaveChanges();
scope.Complete();
}
}
尝试用事务选项创建transactionscope。在事务选项中指定ReadUncommitted。
http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel.aspx http://msdn.microsoft.com/en-us/library/ms149853.aspx