Ehs*_*bar 7 c# entity-framework transactions transactionscope dbcontext
我有一个2 DbContext'
秒,我可以在一个表格中调用它们,你可以在这里看到:
dbcontext1.add(object);
dbcontext1.save();
dbcontext2.add(object);
dbcontext2.save();
Run Code Online (Sandbox Code Playgroud)
所以我有一个问题:如果发生了一些问题并且我的记录被保存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();
}
Run Code Online (Sandbox Code Playgroud)
最好的祝福
我很困惑我应该使用哪一个以及它们之间的区别是什么?
不同之处在于TransactionScope
,只要您将其与单个数据库连接(SQL Server 2005)一起使用或在同一数据库(SQL Server 2008及更高版本)上使用多个连接,其行为就像常规,轻量级和本地事务一样.如果在同一事务范围内使用两个或多个连接或访问多个数据库(同样,取决于SQL Server版本),则将其提升为分布式事务(因此在MSDTC中注册).在您的情况下,它将被提升.
我找到了类似的东西,但我不知道;我不知道如何回滚这个.
只要您不调用Complete
,就会在范围结束后立即回滚事务范围(例如,处置,使用结束等).
如果任何一个db上下文抛出异常,那么Complete
将不会调用您的代码并且将回滚该事务.
来自MSDN:
如果事务范围内没有发生异常(即,在TransactionScope对象的初始化和调用其Dispose方法之间),则允许进行范围参与的事务.如果事务范围内确实发生了异常,则将回滚它参与的事务.
这也是Rollback
不存在方法的原因.
您可能还想查看要与其一起使用的隔离级别.默认是Serializable
.
归档时间: |
|
查看次数: |
3404 次 |
最近记录: |