DbContextTransaction 回滚
Posted
技术标签:
【中文标题】DbContextTransaction 回滚【英文标题】:DbContextTransaction Rollback 【发布时间】:2014-05-19 17:02:33 【问题描述】:Entity Framework 6 引入了一种使用 BeginTransaction 方法在 DbContext 中支持事务的新方法:
var db = new MyDbContext();
using(var tx = db.Database.BeginTransaction())
// update entities
try
db.SaveChanges();
tx.Commit();
catch(Exception)
tx.Rollback();
方法中的 Rollback() 调用是否必要?如果没有在异常上调用它会发生什么?我知道在使用 TransactionScope 时,它会在处理完事务并且不调用 Complete 时自动回滚。 DbContextTransaction 的行为是否类似?
【问题讨论】:
【参考方案1】:不,没有必要显式调用回滚。 tx 变量会在 using 块结束时被释放,如果 Commit() 没有被调用,事务将被回滚。
我已经使用 SQL Server 活动监视器对此进行了测试,通过观察数据库对象上持有的锁,以及查询数据库以观察数据何时回滚,使用我的 select 语句中的 nolock 提示能够查看数据库中未提交的更改。
例如。 select top 10 * from [tablename] (nolock) order by modifiedDate
【讨论】:
我进行了测试并得到了相同的结果,但我没有找到任何与在处置时回滚事务相关的文档。【参考方案2】:对于 EF,数据库提供者是任意的和可插入的,并且 provider 可以替换为 mysql 或任何其他具有 EF 提供程序实现。因此,从 EF 的角度来看, 不能保证提供者会自动回滚 已处置的交易,因为 EF 不知道 数据库提供程序的实现。
这个答案几乎解释了所有 msdn 文档的所有内容和混淆,其中 Rollback 显式调用:https://***.com/a/28915506/5867244
【讨论】:
以上是关于DbContextTransaction 回滚的主要内容,如果未能解决你的问题,请参考以下文章