2010-12-30 15 views
1

私は、あらかじめ生成されたコードを持つ何万ものレコードを持つテーブルを持っています。私はランダムに選択されたコードを毎回ユーザーに与えます。私は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; 
+0

もう一度お試しください!発生したときに生成してユーザーに与えます。 – PurplePilot

+0

あなたのランダムな選択は、利用可能なすべての未使用コードから一様な選択ではありません。それは意図的なのでしょうか? –

+0

@マーク:私はすでに、その状態を質問コードに入れておきましたことを忘れてしまいました。 – user424950

答えて

1

これは、私が選択し、選択したコードを更新する方法です。

また、SELECTクエリにWHERE used = 0が必要ですが、それはこれでカバーされていると思いますか?

... WHERE some conditions AND ... 

また、そこにNO LOCKは必要ありません。

+0

2つのトランザクションで同じコードを選択するとどうなりますか? 2人目は最初のロックがリリースされるのを待って、リリース後に同じものをリリースして選択しますか? – user424950

0
UPDATE MyCodes SET used = 1 WHERE code = @code and used=0 

@@ROWCOUNTを見ると、それはゼロだ場合は、なぜコードを事前に生成し、異なる決定を下すエラーを投げたり

関連する問題