カウンタの値をインクリメントして、その呼び出しがMaxValueに達した場合に返すストアドプロシージャを作成します。トリッキーな部分は、この手順は、別のスレッドや異なるマシンから迅速かつ並列に呼び出すことです。カウンタを増やして原子単位で確実にストアドプロシージャを呼び出す
シナリオ例:平行コールで同じストアドプロシージャを実行
2つのスレッドが同一のカウンタをインクリメントします。 CounterId = 5が両方のパラメータとして渡されると仮定します。いずれかのカウンタレコードを実行する前に、現在、フィールド値はCounterValue = 9とMaxValue = 10です。
私は、CurrentValueを10に正常にインクリメントし、CounterValueがMaxValueに達する原因となった変更の原因であることを示す結果を返すプロシージャの1つを実行します。もう1つの手順では値を増やしてはいけません(10を超えるため)、MaxReachが既にカウンタに一致したことを示す結果を返す必要があります。
私は前後にクエリを実行することを考えましたが、別のスレッドで変更が行われ、偽陽性/陰性が返される可能性のある「穴」を残す可能性があります。
これは手順のアイデアの始まりに過ぎません。私はそれがロック、トランザクションまたは何かが必要なように感じる?
あなたが取引でそれをラップし、次のように、同じトランザクション内の選択を追加する必要が
UPDATE SomeCounters
SET CounterValue = (CounterValue + @AddValue),
MaxReached = CASE WHEN MaxValue = (CurrentValue + 1) THEN 1 ELSE 0
WHERE CounterId = @CounterId
AND MaxReached = 0
?何のために? –
はい、本当の必要条件です。私はデータの流れを追跡しており、データが特定の基準に一致する回数を記録し、MaxValueが満たされたときに追加の作業をトリガする必要があります。現在のシステムでは、Azureテーブルストレージにデータとカウンタが格納され、オプティミスティック並行性を使用して、必要な最終増分を実行することで誰が勝利したかを管理します。パフォーマンスを向上させるために、カウンタをSQL Azureに移動したいと考えています。 – Vyrotek