使用实体框架中的2个DbContexts回滚事务。使用TransactionScope或TransactionBegin?

时间:2014-08-23 10:36:01

标签: c# entity-framework transactions dbcontext transactionscope

我有一个2 DbContext'我可以在一个表单中调用它们,如您所见:

    dbcontext1.add(object);
    dbcontext1.save();
    dbcontext2.add(object);
    dbcontext2.save();

所以我有一个问题:如果发生了一些问题并且我的记录由DbContext1保存但在DbContext2中保存,我需要回滚我的交易。

我搜索了一下,发现了两种方法:使用BeginTransactionTransactionScope。我很困惑我应该使用哪一个以及它们之间的区别是什么?

我找到了类似的东西,但我不知道;我不知道如何回滚这个:​​

using (TransactionScope scope = new TransactionScope())  
{
  using (EFEntities1 dc = new EFEntities1())
  {
     dc.USERS.Add(user);
     dc.SaveChanges();
  }

  using (EFEntities2 dc = new EFEntities2())
  {
     dc.USERS.Add(user);
     dc.SaveChanges();
  }

  scope.complete();
}

祝你好运

1 个答案:

答案 0 :(得分:9)

  

我很困惑我应该使用哪一个以及有什么不同之处   他们之间是谁?

不同之处在于TransactionScope的行为类似于常规,轻量级和本地事务,只要您将其与单个数据库连接(SQL Server 2005)一起使用或在同一数据库上使用多个连接(SQL Server 2008和向上)。如果在同一事务范围内使用两个或多个连接或访问多个数据库(同样,取决于SQL Server版本),则将其提升为分布式事务(因此在MSDTC中注册)。在你的情况下,它将被提升。

  

我发现了类似的东西,但我不知道;我不知道如何回滚这个。

只要您不调用Complete,一旦范围结束(例如处置,使用结束等),事务范围就会回滚。

如果任何一个db上下文抛出异常,那么将不会调用代码Complete并且将回滚事务。

来自MSDN:

  

如果事务范围内没有异常(即介于两者之间)   TransactionScope对象的初始化和调用   它的Dispose方法),然后是范围内的事务   参与者被允许继续。如果在其中发生异常   交易范围,它参与的交易将   回滚。

这也是Rollback方法不存在的原因。

您可能还想查看要使用的隔离级别。默认值为Serializable