我遇到了EF和事务处理方面的问题。
我正在尝试这样做:
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,然后我从描述在调用期间发生的事情的服务中得到唯一的引用和状态,然后我需要将其附加到记录中。
我的理解是,在单个事务期间,您只能更新一次记录/进行一次插入调用,但您不能同时执行这两项操作,因为由于某些原因,这会产生问题……我曾经有一篇MSDN文章,解释了为什么不能这样做的一些逻辑原因(可能是与锁相关的)。
所以我的问题是如何避免这一点,但确保在这些调用中的任何一个失败的情况下,我仍然可以回滚。
发布于 2011-08-27 05:01:03
尝试使用事务选项创建事务作用域。在事务选项中指定ReadUncommitted。
http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel.aspx
http://msdn.microsoft.com/en-us/library/ms149853.aspx
发布于 2011-08-26 23:55:08
当您在事务范围内与数据库建立多个连接时,事务将从本地事务提升为分布式事务,除非您显式地使用与数据库的相同连接。
当事务被提升时,它需要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();
}
}https://stackoverflow.com/questions/7206651
复制相似问题