Nhibernate -锁定数据库

本文关键字:数据库 锁定 Nhibernate | 更新日期: 2023-09-27 18:14:45

我第一次使用Nhibernate,我注意到当我调用BeginTransaction方法时,它锁定了我的数据库。相反,实体框架(ObjectContext或DbContext)将所有更改保存在内存中,如果没有错误发生,SaveChange方法可以完美地工作,而不需要锁定db上的任何内容。

Nhibernate有像EF这样的特性吗?

Nhibernate -锁定数据库

如果您正在使用乐观并发,那么您可以这样做:

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();
}

只要事务处于打开状态(取决于您的隔离级别,如上所述),您就可能对初始选择中涉及的表和键具有共享锁,这将阻止对这些表的更新,直到事务完成。如果您希望避免使用这些锁,您可以抑制读取事务,执行修改,然后稍后尝试更新对象。实体上的版本号应该保护您避免丢失更新。

请注意,您不必抑制读事务。如果您希望阻塞直到所有写都提交,您仍然可以在读取周围要求一个事务,只要它与更新事务分开并且尽可能快地完成即可。