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

本文关键字:使用 TransactionScope TransactionBegin 回滚事务 框架 DbContexts 实体 | 更新日期: 2023-09-27 18:19:08

我有两个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();
}

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

我很困惑我应该用哪一个,有什么不同它们之间是什么?

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

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

只要不调用Complete,事务范围一结束(例如dispose、using结束等),事务范围就会回滚。

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

从MSDN:

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

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

您可能还需要查看与它一起使用的隔离级别。默认为Serializable