インノDB行ロックの実装方法
InnoDBの行ロックは、インデックスレコードをロックすることで実現されます。具体的には、次のように実装されています。
- トランザクション A が特定の行レコードをロックする必要がある場合、InnoDB はその行に対応するインデックスにレコードロックをかける。
- 他のトランザクションがその行にロックをかけている場合、トランザクションAは待機します。
- トランザクションAが他のトランザクションによってロックされた行にアクセスしようとした場合、トランザクションAの分離レベルがREAD COMMITTEDより厳しければ、InnoDBはその行のスナップショットを作成し、古い行をトランザクションAに返します。
- トランザクションAがロックを解放すると、InnoDBはそのインデックス上のロックを解除します。
InnoDBの行ロックはインデックスベースなので、インデックスを使用していない場合や全テーブルスキャンを行っている場合は、データの整合性を担保するために行ロックがテーブルロックに昇格することに注意する。また、InnoDBの行ロックはインデックスベースなので、行ロックを使用する際には、具体的な業務シナリオに応じた適切なインデックスを選択して、ロック競合やデッドロックの発生を回避する必要がある。