トランザクション分離 ACID

トランザクション分離 ACID

mySQL

  • Repeatable read
  • Read Commited

ダーティリード

  • アンコミットがリードできる
  • テーブル単位だとロックがでかいのでブロック単位でロック
  • 結論は行単位ロックになった
  • MYSQL以外はロックにメモリをつかってしまった
  • そのためロックエスカレーションを作った
  • 90%以上の行ロックならテーブルロックにした
  • 昔はとにかく読み込みたいというMVCCが流行る前にいたった答え
  • 集計処理をやりたいときにとにかく瞬間の値を取りたい時に使った

ファジーリード

  • PostgreSQLのデフォルトはReadComittedなので他のコミットが見える

ファントムリード

  • 他のトランザクジョンの追加削除したデータが見えてしまう

ロストアップデート

  • 後に更新した内容でデータが更新され、前者がなくなる

アンチパターン生まないために

  • MYSQLはINDEXがないと調べた行全部ロックする
  • MYSQLはギャップロックができる
  • INSERTだけでもロックは起こる
    • INSERT インテーションロックから排他ロックにエスカレーションするとそれ同士でデットロックする
  • UPSERTがたすぎがけするとデットロック
  • 外部キーで本体と外部キー更新でもデットロックは起きる

簡単すぎる不整合

キャッシュ

  • キャッシュは更新のたびにクリアされるので
  • 更新が増えるとメモリ圧迫が発生
  • Mysql8だとクエリキャッシュがない