EF Transactions MSDTC?

时间:2011-08-26 14:58:08

标签: c# entity-framework msdtc

我对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文章解释过一些逻辑上的原因,为什么这不能做(可能与锁相关)。

所以我的问题是如何解决这个问题,但要确保在任何这些调用失败的情况下我仍然可以回滚。

2 个答案:

答案 0 :(得分:1)

当您在事务范围内与数据库建立多个连接时,事务将从本地事务提升为分布式事务,除非您明确使用与该数据库相同的连接。

当事务被提升时,它需要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();
  }
}

答案 1 :(得分:0)

尝试使用事务选项创建transactionscope。在事务选项中指定ReadUncommitted。

http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel.aspx

http://msdn.microsoft.com/en-us/library/ms149853.aspx