使用NHibernate中的事务从序列中分配整数
我在数据库中有一些序列,用范围表示。它有三个字段:beginId、nextId和endId 任务是从该范围获取nextId,并确保其唯一性。代码可以在高度并行化的环境中运行,在许多机器上有许多线程 我需要做的是:使用NHibernate中的事务从序列中分配整数,nhibernate,transactions,Nhibernate,Transactions,我在数据库中有一些序列,用范围表示。它有三个字段:beginId、nextId和endId 任务是从该范围获取nextId,并确保其唯一性。代码可以在高度并行化的环境中运行,在许多机器上有许多线程 我需要做的是: lock(database) { var seq = GetSequence() var acquiredId = seq.NextId; seq.NextId++ Save(seq) } 所以我使用这个代码: using (ISession sess
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;
}
使用(ISession session=GetSessionFactory().OpenSession())
使用(ITransaction事务=session.BeginTransaction(IsolationLevel.RepeatableRead))
{
var sequence=session.CreateCriteria().Single();//此行已简化
var allocatedId=sequence.NextId;
sequence.NextId++;
session.SaveOrUpdate(序列);
Commit();
返回分配ID;
}
但由于某种原因,当我在多线程中运行此代码进行测试时,我多次收到分配的相同id。我正在使用带有RepeatableRead锁的事务,但这没有帮助
p.S.Id并不意味着表的Id,它只是我们使用的名称协议。我使用了.Lock()。当数据从数据库中获取并且一切正常时升级。感谢hazzik的链接
现在,我的代码有以下内容:
session.QueryOver<Sequence>().Lock().Upgrade.DoSomeFiltering().Single()
session.QueryOver().Lock().Upgrade.DoSomeFiltering().Single()
你能写下你正在使用的数据库管理系统吗?只需回答:不需要调用session.SaveOrUpdate(sequence)因为session和session中已经存在的序列将自动跟踪更改。另外,请阅读这篇Ayende关于如何处理NH@MonkeyCoder中的并发性的文章。应用程序应该与MySQL和MsSQL一起工作。任何其他的问题都在讨论之中,但当然最好不要坚持,或者如果坚持的话,尽量少做。目前,我在MySQL v5上尝试了这种方法,但它不起作用