[英]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
保存但不在DbContext2
中DbContext2
,我需要回滾我的事務。
我搜索了一下,發現了兩種方法:使用BeginTransaction
和TransactionScope
。 我很困惑我應該使用哪一個以及它們之間的區別是什么?
我找到了這樣的東西,但我不知道;我不知道如何回滾這個:
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.