在NHibernate中使用事务从序列中分配整数

时间:2012-10-29 15:53:33

标签: nhibernate transactions

我在数据库中有一些序列,由范围表示。它有三个字段:beginId,nextId和endId。

任务是从此范围获取nextId,并确保它是唯一的。代码可以在高度并行化的环境中运行,在许多机器上有许多线程。

我需要做什么:

lock(database)
{
    var seq = GetSequence()
    var acquiredId = seq.NextId;
    seq.NextId++
    Save(seq)
}

所以我使用这段代码:

using (ISession session = GetSessionFactory().OpenSession())
using (ITransaction transaction = session.BeginTransaction(IsolationLevel.RepeatableRead))
{

    var sequence = session.CreateCriteria<Sequence>().Single(); // This line is simplified

    var allocatedId = sequence.NextId; 
    sequence.NextId++;

    session.SaveOrUpdate(sequence);
    transaction.Commit();
    return allocatedId;
}

但由于某些原因,当我在多线程中运行此代码进行测试时,我收到了多次分配的相同ID。我正在使用带有RepeatableRead锁的事务,但这没有帮助。

P.S。 Id并不意味着表格的ID - 它只是我们使用的名称协议。

1 个答案:

答案 0 :(得分:0)

我使用过.Lock()。从数据库中获取数据时升级,一切正常。感谢hazzik的链接。

现在我的代码有了这个:

session.QueryOver<Sequence>().Lock().Upgrade.DoSomeFiltering().Single()