Nhibernate - 锁定DB

时间:2013-05-20 21:13:04

标签: c# nhibernate orm

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

Nhibernate有些像EF一样吗?

1 个答案:

答案 0 :(得分:2)

如果您使用乐观并发,那么您可以执行以下操作:

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

只要事务处于打开状态(如上所述在隔离级别上进行清除),您可能会对初始选择中涉及的表和密钥进行共享锁定,这将阻止对这些表的更新,直到事务完成。如果要避免使用这些锁,可以禁止读取事务,执行修改,然后尝试稍后更新对象。实体上的版本号应该可以保护您免受丢​​失的更新。

请注意,您不必禁止读取事务。如果要阻止所有写入提交,只要它与更新事务分开并尽快完成,您仍然可以要求读取事务。