我第一次使用 Nhibernate,我注意到当我调用 BeginTransaction 方法时,它会锁定我的数据库。相反,实体框架(ObjectContext 或 DbContext 也是)将所有更改保留在内存中,并且如果没有错误发生,则 SaveChange 方法可以完美地工作而无需在 db 上锁定任何内容。
Nhibernate 有像 EF 这样的功能吗?
我第一次使用 Nhibernate,我注意到当我调用 BeginTransaction 方法时,它会锁定我的数据库。相反,实体框架(ObjectContext 或 DbContext 也是)将所有更改保留在内存中,并且如果没有错误发生,则 SaveChange 方法可以完美地工作而无需在 db 上锁定任何内容。
Nhibernate 有像 EF 这样的功能吗?
如果您使用的是乐观并发,那么您可以执行以下操作:
MyEntity myEntity;
using(var scope = new TransactionScope(TransactionScopeOption.Suppress))
using(var session = sessionFactory.OpenSession())
{
myEntity = session.Get<MyEntity>(id);
scope.Complete();
}
// No longer in a transaction...
myEntity.Add(something);
myEntity.Update(somethingElse);
// Later, possibly in another request...
using(var scope = new TransactionScope(TransactionScopeOption.Required))
using(var session = sessionFactory.OpenSession())
{
session.Update(myEntity);
scope.Complete();
}
只要事务处于打开状态(如上所述,取决于您的隔离级别),您可能会在初始选择中涉及的表和键上拥有共享锁,这将阻止对这些表的更新,直到事务完成。如果您想避免拥有这些锁,您可以禁止读取事务,执行修改,然后稍后尝试更新对象。实体上的版本号应该可以保护您免于丢失更新。
请注意,您不必禁止读取事务。如果要阻塞直到提交所有写入,您仍然可以要求围绕读取的事务,只要它与更新事务分开并且尽快完成即可。