2017年4月15日土曜日

トランザクション分離レベルREPEATABLE READについて

トランザクション分離レベルREPEATABLE READについて、
REPEATABLE READとは同じトランザクション内では必ず同じ値を表す設定です。
MySQLはこのレベルをDefaultに使用しています。
REPEATABLE READがどのように動作するか確認しましょう。


左をトランザクションt1と言います。
右をトランザクションt2と言います。

t1とt2でお互いにbeginを起こしてt1にてInsert, commitをしてt2にて見えるかを確認しました。実行時間を見てください。
t2ではbeginをしてからはselect * from test;をしてもt1で入力した値が見えません。t2 beginを完了した後にselectしたら値が見えました。
updateも同じトランザクションでは同じ値が見えます。
一活性読み取り専用です。これを REPEATABLE READと言います。

PostgreSQLとOracleをREAD COMMITTEDを使用していますので異なるトランザクションでcommitすると他のトランザクションでは見えます。
なぜ、MySQLはREPEATABLE READをDefaultに利用しているし、これはいつ使うものでしょうか?
僕もなぜMySQLはREPEATABLE READをDefaultにしているかわかりません。
しかし、いつ使うかはわかります。
例) トランザクション(t1)が時間テーブルの値が1秒ことに変更します。
   時間テーブルの値を見て8時00分00秒に動くスケジュールを5件組みました。
   トランザクション(t2)がを1件処理するのに1秒かかります。
   スケジュールを読みながら1件ずつ実行したら
   1件処理後1秒かかりましたので時間テーブルの値を見ると8時00分01秒になります
   ので次のスケジュールは実行できません。
   このとき使うトランザクション分離レベルREPEATABLE READです。
   トランザクション(t2)がcommitしてないと全部同じ8時00分00秒で実行ができます。

システムを作るときに仕様を理解したうえでトランザクション分離レベルを設定するとよいシステムができると思います。アーキテクチャー、データモデラーなどは必ずシステムの特性を理解して上で設計をしましょう。

以上です。



0 件のコメント: