Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL5 分離レベル ~ transaction_isolation

すごーく、いまさらなんですが、MySQL5.5から分離レベルが実装されました。もはやMySQLは商用データベースレベル!当方5.5が出て散々騒がれたときには何も触らないで、つい最近やっと検証するようになり気づいたのですが、何するにしても、なんかロックが多いな・・と感じていて、my.cnfを漠然と眺めていたら・・・あったよ、そんな設定が・・・。

分離レベルって何?

そもそも分離レベルって何というところを説明すると、正直細かい定義は理解していないのですが、簡単に説明するとデータの一貫性を保つためのロックメカニズムのレベルを表すものなのです。商用DBMSを扱っているDBAの方はよく知っているものです。(俺、なんとなくしかしらないけど)詳しくは、wikiに書いておりましたので、参考までに見てくださいね。この部分って実は大切で、金銭が絡むシステムとか、空港の予約状況照会とか、そういうミッションクリティカルなシステムを扱っている方には大変重要な項目です。つまり、読みこんだデータが、読み込んでいるうちに変わってしまうなんてあってはならないことにならないように、読み込んだデータを一旦ロックして更新をかけないようにするとかそんな利用用途で設定したりするものです。

逆に、

掲示板とか、SNS系でその読み取り一貫性が必要か?といったら・・どうでしょうか?読んだデータが途中で変わったとしても別に・・・困らないですよね?、まあ全部が全部困らないわけではなくシステムによっては、重大な被害がもたらす危険性があると思いますのでなんともいえないですが・・・もっというと、WEB系のシステムの場合は、基本的にステートレスなので、なんぼ一環性を保ったとしても、ブラウザで表示さえている項目が、次回アクセス時には変わっているかもしれません。

つまり・・・

MySQLの分離レベルに話しを戻します。えと・・つまり何が言いたいかというと、WEB主体のシステムにおいて、厳密なロックレベルにする必要がないのに、「MySQL5.5にしたらやたらロックが多発するな・・・」なんて感じている方は一度、mysqlの現在の、分離レベルを確認してみてください。ちなみに当方の検証環境では以下のようになっておりました。

mysql> show variables like '%iso%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)

REPEATABLE-READ か、なるほど・・なぬ?REPEATABLE-READ!??

  • REPEATABLE-READ データベースの読み取りと変更時にロックがかかります。

正直なところ、読み取り一環性の必要のない(私の)システムでは、こんな設定は必要なく、もっとゆるゆるで、検索のパフォーマンスをアップしたかったのですが、いつからこんな設定になっているのだろうか?と調べていたら、my.cnfがデフォルトでそうなっていました。あぁ。。たしかサンプルに利用した、my.cnfは、innodb_heavy4Gとかいうやつだったけか?・・・納得

# Set the default transaction isolation level. Levels available are:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ

もっと設定をゆるくしたい

分離レベルには、上記に示す通り4種類ありまして上から順番により厳格な設定になっております。

  • SERIALIZABLE(直列可能)
  • REPEATABLE-READ (反復可能読み取り)
  • READ-COMMITTED (コミット読み込み)
  • READ-UNCOMMITTED (未コミット読み取り)

つまり、上記の設定は、二番目に厳格な分離レベルになっていたわけです。ここを、READ-UNCOMMITTEDに変更したら・・ロックの問題はなくなりましたとさ。ただし、Oracleとかですと、デフォルトの分離レベルはたしか、CSかと思ったので、このページのうのみにして、最低レベルの分離レベルで設定して、色々困らないように注意してくださいね。あくまでも私の検証環境の話で解決したってだけで、より厳密なトランザクションをかけるシステムで問題を解決させる必要のある方は、データベースの設定の話だけではなくアプリケーションのトランザクション設計のほうが重要なわけなので。

長々書きましたが、詰まるとこ、ここがわかりやすいかも(笑

MySQLがどんどんレベルが上がってきて怖いです・・・・。

追伸

MySQL5.0のときからデフォルト分離レベルってあったののね・・・知らなかった。