MySQLの行レベルロックのルール
MySQLの行レベルロックはInnoDBストレージエンジンを使用することで実現されます。以下がMySQLの行レベルロックのルールです。
- 行レベルのロックはインデックスベースで行われます。つまり、インデックス経由でのみデータにアクセスしてロックできます。インデックスを使用していない場合、MySQLは自動的にテーブルレベルのロックを使用します。
- InnoDBストレージエンジンは、共有ロック(Sロック)と排他ロック(Xロック)の2種類の行レベルロックをサポートしています。
- 共有ロック(Sロック):複数のトランザクションが同一の共有ロックを同時に保持でき、データの読み取りに使用されます。ひとつのトランザクションが共有ロックを保持しているとき、他のトランザクションは共有ロックを保持し続けることは可能ですが、排他ロックを取得することはできません。共有ロックを獲得している間は、他のトランザクションは行に対してXロックを取得することができません。
- 排他ロック(Xロック):1つのトランザクションが排他ロックを1つだけ保持でき、データの変更に使用されます。あるトランザクションが排他ロックを保持している場合、他のトランザクションはその行に対してどのような種類のロックも保持できません。
- トランザクションが一行のデータをロックする場合、以下の規則に従って判断されます。
- 他のトランザクションでロックされていない場合は、現在のトランザクションでロックできます
- 当該行が他のトランザクションにより共有ロック(Sロック)されている場合、現在のトランザクションで共有ロックを追加することはできます。
- 他のトランザクションで排他ロック(Xロック)がかけられている場合は、現在のトランザクションはロックが解放されるまでロックをかけるのを待機する必要があります。
- InnoDBストレージエンジンは多粒度ロックをサポートしている。つまり、行レベルロック、テーブルレベルロック、ページレベルロックなど、さまざまなレベルでロックすることができます。行レベルロックは最も詳細なロックレベルです。
- テーブルロック:テーブル全体をロックし、大規模なデータ修正に適しています。LOCK TABLES ステートメントを使用して取得します。
- ページ単位ロック:隣り合う複数の行をロックし、一つのページ上のデータアクセスに利用します。テーブルスペース内のページによって管理されます。
- 行レベルロック: 特定の行の操作(変更または読み取り)にのみ適用される、個々の行をロックします。
行レベルロックは並行処理においてパフォーマンスやコンカレンシーを向上させますが、過剰なロック操作はパフォーマンス低下やデッドロックを引き起こす可能性があるため、並行性のシナリオやロックの粒度を慎重に検討することが重要です。