は、このシナリオを想像:NHibernateはIListの(順序付きリスト)競合状態
- Anが実体上のコレクションを命じました。
- コレクション内の新しいアイテムに対する2つの同時(非同期)CREATE要求
- 両方の新しいアイテムが同じ序数を取得します。
コレクションはそうのようなものです:
public virtual IList<CustomField> CustomFields { get; protected set; }
私はそうのような流暢NHibernateのマッピングがあります。
mapping.HasManyToMany(cp => cp.CustomFields)
.AsList(i => i.Column("CustomFieldOrdinal"))
.ParentKeyColumn("RegistrationId")
.ChildKeyColumn("CustomFieldId");
理由はNHibernateのは、次の利用可能な順序を取得するには、DBを照会していることであることをテーブルにロックされておらず、どちらも同じ序数になっています。
これをどのように防ぐことができますか?
実際のユースケースについて詳しく説明できますか?このような問題は、データベースレベルで処理する必要があります(作成するトランザクションを処理する方法を変更する可能性があります)。また、使用しているデータベースを知ることは、使用の情報になる可能性があります。 –
私はSQLサーバを使用しています(azureで)。私のユースケースについては、あなたが知りたいことは何ですか?それはまさに記述されているとおりです。これはdbレベルで最もうまく処理されると思いますか?現在、私はそれを動作させています...私はnhibernateトランザクションでテーブルロックを使用しています、そして、今働いています。 – richard
あなたは「両方の新しいアイテムが同じ序数を得ます」と書いています。しかし、これが効果です。それは「方法」ではありません。どのようにNHibernateに順序番号を生成させるのですか?問題の理由(および可能な解決策)はその中にあります。 「テーブル・ロックを使用する」は、データベース・レベルでそれを解決する1つの方法です。もう1つは、列をデフォルト値で構成し、dbに計算を処理させることです。 –