MySQL, SEノウハウ

MySQL 外部キー制約のデッドロック

 

外部キー(FOREIGN KEY)制約を利用している場合、
子テーブルに追加、更新や削除を行う時は、
必ず親テーブルの対象のidに対して排他ロックを行ってから、更新や削除、追加を行う。

  1. 親テーブルの該当idに対して排他ロックを取る
  2. 子テーブルの該当行に対して追加、更新、削除等を行う

これならロックは起こらない。

 

 

  • 外部キー制約を利用していると、
    子テーブルにINSERT, UPDATE, DELETEを行うと親に共有ロックがかかる
  • 外部キー制約を利用している子テーブルにINSERT, UPDATE, DELETEを行う場合は、
    排他ロック「FOR UPDATE」をかけてからINSERT, UPDATE, DELETEを行う

 

共有ロック→排他ロックはデッドロックが起こる原因になる。外部キー制約を利用しているテーブルをSELECT以外で操作する場合は、必ず排他ロックを行ってから、更新や削除、追加を行う。

 

MySQLでの遅延制約 抜け穴

トランザクション中のみ外部キー制約のみを無視する

FOREIGN_KEY_CHECKS=0

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)