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

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

EF Transactions MSDTC?

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

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