タグ

ブックマーク / qiita.com/rev84 (1)

  • updateが行ロックするとは限らない(MySQL InnoDB) - Qiita

    MySQLで、スレッドが排他的にテーブルを操作する方法がねえかと考えた。 updateなりdeleteなりなら行ロックでも別にいいのだが、テーブルに対するinsertもロックする方法がわからん。 LOCK TABLES構文というのを見つけて「名前的にこれやろ」と思ったが全然違って、しかも運用中のサービスに安易にコードを付け加えテストもせずにリリースしてしまったおかげで、4人しか入れない部屋に10人ぐらい参加してゲームが始まらないという恐怖の状態に陥ってしまった。当たり前である。(LOCK TABLES は、現在のスレッドに対してベース テーブル (ビュー以外) をロックします) 最初は、LOCK TABLESが「現在のスレッドに対しロック」して、「もしテーブルが1つでも他のスレッドによってロックされていたら、それは全てのロックを入手するまでブロック」するというのなら、必要なデータの読み書き

    updateが行ロックするとは限らない(MySQL InnoDB) - Qiita
    keihs
    keihs 2013/09/20
    “for updateなどでロックしても、トランザクションを「張った時点」のDBの状態(排他ロックしたスレッドのcommit等を反映していないデータ)を持ってくることがある。”
  • 1