特に、次の利用可能な値(=ギャップなし)を主張する場合、簡単な方法はありません。自動増分値を使用すると、アプリケーションのパフォーマンスが向上します。
何が問題ですか?あなたがデータベース
にエンティティを保存する必要があなたのエンティティ
に割り当てる必要があり、データベース
から値を取得する必要があり
- は簡単に見えますが、ではありませんそれ?他のスレッドがステップ3に達する前に同時に複数のスレッドがステップ1を実行できる同時環境がある場合はありません。すべてのスレッドは同じ値のレコードを挿入します。
どうすれば対処できますか? 1つの方法は、値を取得してインクリメントするために、最大値とアトミック演算を持つ別のテーブルを使用することです。私はこのような何かをやってストアドプロシージャがアトミックであるべきだと思う:
DECLARE @Result INT
UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...'
RETURN @Result
ストアドプロシージャへの呼び出しは、最高のスループットを作るために、任意のトランザクションの外でなければなりません。
これは、うまくいけば、一意の数字を生成することができますが、ギャップのないシーケンスは生成できません。そのような操作で値を取ってその値を使用しないと、値が失われ、シーケンスにギャップが含まれます。
ギャップを必要としない場合は、ストアドプロシージャ呼び出しと操作をトランザクションに入れて、データがコミットされるまでシーケンステーブルのレコードがロックされるようにする必要があります。
ありがとうございました。 – Jonnster