我有一个2 DbContext'
我可以在一个表单中调用它们,如您所见:
dbcontext1.add(object);
dbcontext1.save();
dbcontext2.add(object);
dbcontext2.save();
所以我有一个问题:如果发生了一些问题并且我的记录由DbContext1
保存但在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();
}
祝你好运
答案 0 :(得分:9)
我很困惑我应该使用哪一个以及有什么不同之处 他们之间是谁?
不同之处在于TransactionScope
的行为类似于常规,轻量级和本地事务,只要您将其与单个数据库连接(SQL Server 2005)一起使用或在同一数据库上使用多个连接(SQL Server 2008和向上)。如果在同一事务范围内使用两个或多个连接或访问多个数据库(同样,取决于SQL Server版本),则将其提升为分布式事务(因此在MSDTC中注册)。在你的情况下,它将被提升。
我发现了类似的东西,但我不知道;我不知道如何回滚这个。
只要您不调用Complete
,一旦范围结束(例如处置,使用结束等),事务范围就会回滚。
如果任何一个db上下文抛出异常,那么将不会调用代码Complete
并且将回滚事务。
来自MSDN:
如果事务范围内没有异常(即介于两者之间) TransactionScope对象的初始化和调用 它的Dispose方法),然后是范围内的事务 参与者被允许继续。如果在其中发生异常 交易范围,它参与的交易将 回滚。
这也是Rollback
方法不存在的原因。
您可能还想查看要使用的隔离级别。默认值为Serializable
。