「外部キー Night」に参加してきた
発表者として参加させていただきました。
発表資料はこちらです(自分でも忘れそうなのでブログにリンク貼っておく)
外部キー制約に伴うロックの小話追記: 2015/08/22
ブログでも補足したほうが良いかな、と思ったので今更追記することにしました。
どういう資料?
外部キー制約で発生するロックのお話です。前提として、MySQL(5.5.28)のInnoDBストレージエンジン、トランザクション分離レベルはREPEATABLE-READ, READ-COMMITEDです。上記は検証環境ですが、MySQL5.1 ~ 5.7でも変化していない挙動のはずです。また、InnoDBのロックはインデックスレコードロックなので、インデックスに対する理解が必要不可欠です。発表時間も20分程度ということもあって、その辺りをある程度理解されてる方が対象の資料となっています。
3行でまとめると?
- INSERT時には自動的に共有ロックが取られるぞ!
- INSERTする前には外部キー制約の行を排他ロックしろよ!
- それでも避けられないパターンがあるぞ!覚悟しろ!
最後は何を言ってるんだ、という感じですが、テーブル定義に依存する話を紹介しています。残念ながら発覚後に対処するのは極めて難しいものと思われます。