1

範囲で表されるデータベースにいくつかのシーケンスがあります。これには、beginId、nextId、および endId の 3 つのフィールドがあります。

タスクは、この範囲から 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 ロックでトランザクションを使用していますが、それは役に立ちません。

PS Id は、テーブルの Id を意味するものではありません。使用する名前の取り決めです。

4

1 に答える 1

0

DB からデータを取得するときに .Lock().Upgrade を使用しましたが、すべてが機能しました。リンクの hazzik に感謝します。

今私のコードはこれを持っています:

session.QueryOver<Sequence>().Lock().Upgrade.DoSomeFiltering().Single()
于 2012-10-30T11:21:21.257 に答える