SELECT ... FOR UPDATE
行を排他モードでロックします。つまり、最初の選択が完了するかロールバックされるまで、2番目の選択を続行できません。これは、2番目の選択の結果が、ロックした行の内容の影響を受ける可能性があるためです。そのため、チェックするには、行の読み取りロックを取得する必要があります。
UNIQUE INDEX
を作成する場合 たとえば、id
、あなたはできる;
select * from SolrCoresPreallocated where id=1 for update;
最初のトランザクションで;
select * from SolrCoresPreallocated where id=2 for update;
一意のインデックスにより、2番目の選択で最初の行をリードロックせずに正しい行を見つけることができるため、2番目の行では独立しています。
編集:「無料」の行をできるだけ早く取得するには、実際には2つのトランザクションを実行するしかありません。
- BEGIN / SELECT FOR UPDATE/UPDATEからbusy/COMMITに移動して、行を取得します。
- BEGIN/<行の処理>/更新して解放/コミットして行を処理して解放します。
これは、プロセスが失敗し、行を解放するように更新するトランザクションをロールバックする場合に補償アクションが必要になる可能性があることを意味しますが、MySQL(またはそのことについては標準SQL)には「次のロック解除された行を取得する」という概念がないため「、選択肢はあまりありません。