簡體   English   中英

使用實體框架中的2個DbContexts回滾事務。 使用TransactionScope或TransactionBegin?

[英]Rollback transaction with 2 DbContexts in Entity Framework. Use TransactionScope or TransactionBegin?

我有一個2個DbContext' ,我可以在一個表單中調用它們,如下所示:

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

所以我有一個問題:如果發生了一些問題並且我的記錄由DbContext1保存但不在DbContext2DbContext2 ,我需要回滾我的事務。

我搜索了一下,發現了兩種方法:使用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();
}

最好的祝福

我很困惑我應該使用哪一個以及它們之間的區別是什么?

不同之處在於TransactionScope行為類似於常規,輕量級和本地事務,只要您將其與單個數據庫連接(SQL Server 2005)一起使用或在同一數據庫(SQL Server 2008及更高版本)上使用多個連接即可。 如果在同一事務范圍內使用兩個或多個連接或訪問多個數據庫(同樣,取決於SQL Server版本),則將其提升為分布式事務(因此在MSDTC中注冊)。 在您的情況下,它將被提升。

我找到了類似的東西,但我不知道;我不知道如何回滾這個。

只要您不調用Complete ,就會在范圍結束后立即回滾事務范圍(例如,dispose,使用結束等)。

如果任何一個db上下文拋出異常,那么在您的代碼中將不會調用Complete並且將回滾該事務。

來自MSDN:

如果事務范圍內沒有發生異常(即,在TransactionScope對象的初始化和調用其Dispose方法之間),則允許進行范圍參與的事務。 如果事務范圍內確實發生了異常,則將回滾它參與的事務。

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

您可能還想查看要與其一起使用的隔離級別。 默認值為Serializable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM