トランザクション実行時の問題と分離レベル

Dirty Read

別のtransactionで更新後、commitされていないデータを読む。

TransactionA

     x=10   x=x-5
      |      |
x=10  |r     |w      rollback  x=10
----------------------------------
            x=5    |r
                   |
                  x=5
TransactionB

Fuzzy Read (Nonrepeatable Read) = 反復不能読み取り

同一Transaction内で同じselectが実行されたときに、同じ参照結果が得られない

TransactionA
       X=10    X=X-5
        |       |
 X=10  |r      |w
-----------------------------------
        |r      X=5     |r
        |               |
       X=10            X=5
TransactionB

Fantom Read

Transaction中に現れたり消えたりするデータが存在

TransactionA
                  |insert
                  |w
-----------------------------------
     |                           |
     |	                         |
    count(*)=10               count(*)=11

TransactionB

分離レベルの指定

                 Dirty Read   Fuzzy Read  Fantom Read
READUNCOMMITED   *            *           *

READCOMMITED     OK           *           *     

REPEATABLEREAD   OK           OK          *

SIRIALISABLE     OK           OK          OK

(参考)トランザクション実行時の問題と分離レベルについて
http://d.hatena.ne.jp/zecl/20080204/p3