我在数据库中有一些序列,由范围表示。它有三个字段: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 - 它只是我们使用的名称协议。
答案 0 :(得分:0)
我使用过.Lock()。从数据库中获取数据时升级,一切正常。感谢hazzik的链接。
现在我的代码有了这个:
session.QueryOver<Sequence>().Lock().Upgrade.DoSomeFiltering().Single()