Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NHibernate中的事务从序列中分配整数_Nhibernate_Transactions - Fatal编程技术网

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

使用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

我在数据库中有一些序列,用范围表示。它有三个字段: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;
}
使用(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上尝试了这种方法,但它不起作用