次の問題にいくつかのアドバイスを提供してください: 私はユニークなコードのリストを持っています。コードは一度だけ使用する必要があります。そのため、各コードに関連付けられたステータス(使用/未使用)があります。SQL - ロックするかロックしない:次の未使用コードを選択
複数のスレッドが次の未使用コードを取得しようとすると、競合/競合状態が心配です。
SQLデータベース(私の場合はMySQL)を使用して実装する最良の方法は何ですか?
最初のオプション分離レベルロックを使用し、読み取りコミットすることである:スレッドの競合の場合
start transaction in read-committed isolation level
select code from code_table where status = 'not-used' for update
update code_table set status = 'used' where code = :code
commit transaction
、Iは、「データベース・スレッドは」ロックされた行につまずくであろうと考えています行書き込みロックが解放されない限り待機し、このコードレコードがすでに使用されていることを(読み取りコミットされた分離レベルのために)表示し、他のコードレコードに移動します。
start transaction in default isolation level (read-repeatable)
select code from code_table where status = 'not-used'
commit transaction
start transaction in default isolation level (read-repeatable)
update code_table set status = 'used' where code = :code
commit transaction
Javaコードでは、私がどれだけチェックします:
番目のオプションは(私たちは休止状態を使用していない)楽観的ロックを休止状態に類似したものを使用することで、ここでの手順の説明がありますレコードが更新されました。レコードが1つ更新されている場合は、レコードが更新されていればすべてOKです.3回目(または5回目)の試行後にステップを繰り返します。例外をスローします。
ご迷惑をおかけして申し訳ございません。 ありがとうございます
OK、削除されたSQL Server .... – user3489820