ichirin2501's diary

いっちりーん。

「外部キー Night」に参加してきた

発表者として参加させていただきました。

発表資料はこちらです(自分でも忘れそうなのでブログにリンク貼っておく)

外部キー制約に伴うロックの小話


追記: 2015/08/22
ブログでも補足したほうが良いかな、と思ったので今更追記することにしました。

どういう資料?

外部キー制約で発生するロックのお話です。前提として、MySQL(5.5.28)のInnoDBストレージエンジン、トランザクション分離レベルはREPEATABLE-READ, READ-COMMITEDです。上記は検証環境ですが、MySQL5.1 ~ 5.7でも変化していない挙動のはずです。また、InnoDBのロックはインデックスレコードロックなので、インデックスに対する理解が必要不可欠です。発表時間も20分程度ということもあって、その辺りをある程度理解されてる方が対象の資料となっています。

3行でまとめると?

  1. INSERT時には自動的に共有ロックが取られるぞ!
  2. INSERTする前には外部キー制約の行を排他ロックしろよ!
  3. それでも避けられないパターンがあるぞ!覚悟しろ!

最後は何を言ってるんだ、という感じですが、テーブル定義に依存する話を紹介しています。残念ながら発覚後に対処するのは極めて難しいものと思われます。

いちりんちゃん的には外部キー制約どうなの?

MySQLなら避けます。資料内容以外でも、現在、MySQLだとパーティションが利用できなくなる、パフォーマンスも落ちる、など色々デメリットがあります。大抵の環境ではデメリットが勝るでしょう。ただ、開発環境では外部キー制約を利用して異常を発見し易くしたりするのはありだと考えてます。

最後に、
ロックと仲良く!