私は、あらかじめ生成されたコードを持つ何万ものレコードを持つテーブルを持っています。私はランダムに選択されたコードを毎回ユーザーに与えます。私は1つのコードを選択し、直ちに "used"として更新します。私の問題は、たまには2人のユーザーが同じコードを取得することです。 2人のユーザーに同じコードを渡さない保証された方法はありますか?あなたがトランザクションで両方のステートメントを実行し、唯一のトランザクションをコミットすると、成功した場合、ユーザーにコードを与えることができランダムレコードを選択するときに同じ行を選択しないとどうなるでしょうか
SELECT TOP 1 @code = code FROM MyCodes WITH (NOLOCK) WHERE used = 0 and some other conditions
AND 0.01 >= CAST(CHECKSUM(NEWID(), code) & 0x7fffffff AS FLOAT)/CAST (0x7fffffff AS INT);
UPDATE MyCodes SET used = 1 WHERE code = @code;
もう一度お試しください!発生したときに生成してユーザーに与えます。 – PurplePilot
あなたのランダムな選択は、利用可能なすべての未使用コードから一様な選択ではありません。それは意図的なのでしょうか? –
@マーク:私はすでに、その状態を質問コードに入れておきましたことを忘れてしまいました。 – user424950