外部キー(FOREIGN KEY)制約を利用している場合、
子テーブルに追加、更新や削除を行う時は、必ず親テーブルの対象のidに対して排他ロックを行ってから、更新や削除、追加を行う。
- 親テーブルの該当idに対して排他ロックを取る
- 子テーブルの該当行に対して追加、更新、削除等を行う
これならロックは起こらない。
- 外部キー制約を利用していると、
子テーブルにINSERT, UPDATE, DELETEを行うと親に共有ロックがかかる - 外部キー制約を利用している子テーブルにINSERT, UPDATE, DELETEを行う場合は、
排他ロック「FOR UPDATE」をかけてからINSERT, UPDATE, DELETEを行う
共有ロック→排他ロックはデッドロックが起こる原因になる。外部キー制約を利用しているテーブルをSELECT以外で操作する場合は、必ず排他ロックを行ってから、更新や削除、追加を行う。
もくじ
MySQLでの遅延制約 抜け穴
トランザクション中のみ外部キー制約のみを無視する
FOREIGN_KEY_CHECKS=0