我希望了解在相同的数据库上下文中执行事务时,以下3种方式的实际差异是什么:
1)使用一个单独的
在(2)和(3)中,如果
如果(1)也可以安全地在同一个数据库上下文中执行多个操作,那么手动启动事务的主要用途是什么?我想我们可以手动提供try / catch块来回滚事务,如果发生了一些不好的事情,但据我所知,SaveChanges()也至少在SQLServer中自动覆盖它。
**更新:另一件事是:我应该将db上下文和事务变量设置为类级别,还是这些变量应该仅限于包含方法的局部变量?
1)使用一个单独的
SaveChanges()
进行多个操作,而不显式地使用SQL事务。using (TestDbContext db = new TestDbContext())
{
// first operation
// second operation
db.SaveChanges();
}
2) 使用SQL事务,在一次SaveChanges()
中执行多个操作
using (TestDbContext db = new TestDbContext())
using (DbContextTransaction trans = db.Database.BeginTransaction())
{
// operation 1
// operation 2
db.SaveChanges();
trans.commit();
}
3) 使用sql事务进行多个操作并且有多个SaveChanges()
。
using (TestDbContext db = new TestDbContext())
using (DbContextTransaction trans = db.BeginTransaction())
{
// operation 1
db.SaveChanges();
// operation 2
db.SaveChanges();
trans.commit();
}
在(2)和(3)中,如果
commit()
应该实际上执行请求的sql查询到数据库,那么它是否真的不同,例如每个操作保存更改还是一次性保存所有操作的更改?如果(1)也可以安全地在同一个数据库上下文中执行多个操作,那么手动启动事务的主要用途是什么?我想我们可以手动提供try / catch块来回滚事务,如果发生了一些不好的事情,但据我所知,SaveChanges()也至少在SQLServer中自动覆盖它。
**更新:另一件事是:我应该将db上下文和事务变量设置为类级别,还是这些变量应该仅限于包含方法的局部变量?
SaveChanges()
创建的。EF不会为查询创建事务,因此在此之前的任何读取操作都不包括在事务中。在示例2中,您在操作开始时创建它,因此根据隔离级别设置,通过读取它们可能更早地锁定行。 - MutantNinjaCodeMonkey