MySQLのロック/トランザクション機構メモ

実践ハイパフォーマンスMySQL
を読んで、基礎を学習中。備忘のためにメモ。

ロックとエンジン

MySQLにはストレージエンジンがいくつかあるが、それぞれ使うロック方式が決まっている。
下にいくほど並行処理に強いが、その分だけ処理のオーバーヘッドが発生する。
ケースによって使い分けることが大事。

  • テーブルロック
  • ページロック
    • BDB
  • 行ロック(マルチバージョン並行処理制御)
ACID

トランザクションはACID性を満たさなければならない。

  • Atomicity(原子性)
    • トランザクションを分割できない1単位として機能させる
    • 全体として成功か失敗かしかなく、一部のみ完了という状態を排除する
  • Consistency(整合性)
    • ある状態から整合性の取れた状態に移ることを保証する
  • Isolation(独立性)
  • Durability(永続性)
独立性レベル

いくつかレベル分けされており、どの問題(Dirty Read, Non-Repeatable Read, Phantom Read)まで防ぎたいかによって選択すべき独立性レベルが変わる。

  • 非コミット読み出し(Read uncommitted)
    • Dirty, Non-Repeatable, Phantomいずれも防げない
  • コミット済み読み出し(Read committed)
    • Dirtyは防げる
    • Non-Repeatable, Phantomは防げない
  • 反復可能読み出し(Repeatable read)
    • Dirty, Non-Repeatableは防げる
    • Phantomは防げない
  • 直列化可能(Serializable)
    • Dirty, Non-Repeatable, Phantomいずれも防げる
    • InnoDBのネクストキーロック機構により実現している


ちなみに、InnoDBのデフォルトはREPEATABLE READ。