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的行为是否相似?
答案 0 :(得分:32)
不,没有必要显式调用Rollback。当using块完成时,将处理tx变量,如果尚未调用Commit(),则将回滚事务。
我已经使用SQL Server Activity Monitor对此进行了测试,通过观察数据库对象上的锁定,以及查询数据库以观察数据何时回滚,使用我的select语句中的nolock提示能够查看数据库中未提交的更改
例如。 select top 10 * from [tablename] (nolock) order by modifiedDate
答案 1 :(得分:0)
对于EF,数据库提供程序是任意的和可插入的,并且 提供程序可以替换为MySQL或具有 EF提供者实施。因此,从EF的角度来看, 无法保证提供程序将自动回滚 所处置的交易,因为EF不了解 数据库提供程序的实现。
此答案几乎可以解释所有内容,以及所有具有 Rollback 明确调用的https://stackoverflow.com/a/28915506/5867244
的msdn文档