[InterDB] [著者HP] [PREVIOUS][UP][NEXT]

Copyright @ 2009, Suzuki Hironobu @ InterDB



■2-09■ トランザクションの隔離レベル

InnoDB型とBDB型のテーブルはトランザクション処理をサポートしています。
`トランザクションの隔離'とは、トランザクション間で影響を与え合わないようにそれぞれについて分離独立した状態を作って、処理の一貫性を保証することです。

もしもトランザクションの隔離を行わずに複数のトランザクションを並行して実行すると、次のような問題が起こる可能性があります。

(1)ダーティリード (Dirty Reads)(【図.2-21】参照)
他のトランザクションが更新/挿入した、コミットされていないデータを読み込んでしまう。

図.2-21 ダーティリード (Dirty Reads)

(2)反復不能読み取り (Non-Repeatable Reads)(【図.2-22】参照)
トランザクションBが2度、同じテーブルのデータを読み込む。1度目と2度目の読み込みの間にトランザクションAがそのデータの更新してコミット(COMMIT)すると、読み取りタイミングによってデータの値が異なってしまう。

図.2-22 反復不能読み取り (Non-Repeatable Reads)

(3)ファントムリード (Phantom Reads)(【図.2-23】参照)
トランザクションBが2度、同じテーブルのデータを読み込む。1度目と2度目の読み込みの間に他のトランザクションAがデータを挿入してコミット(COMMIT)すると、読み取りタイミングによって検査結果が異なってしまう。

図.2-23 ファントムリード (Phantom Reads)

SQL92,99では上記の問題に対応するため、4つのトランザクション隔離レベルを定義しています。
それら4つの隔離レベルと、問題(ダーティリード,反復不能読み取り,ファントムリード)に対する効果は次のとおりです(【表.2-7】参照)。

表.2-7 トランザクションの隔離レベルと問題に対する効果
隔離レベルダーティリード反復不能読み取りファントムリード
READ UNCOMMITTED可能性あり可能性あり可能性あり
READ COMMITTED安全可能性あり可能性あり
REPEATABLE READ安全安全可能性あり
SERIALIZABLE安全安全安全

MySQLはこれらすべてのトランザクション隔離レベルが設定可能です(補足 1)。デフォルトの隔離レベルは`REPEATABLE READ'です。

デフォルトの隔離レベルはシステム変数`transaction-isolation'に設定します。セッション毎の隔離レベルを変更するにはSET TRANSACTION ISOLATION LEVEL文を実行します。


補足


(1)
MySQLバージョン4.0.5以降、4つの隔離レベルすべてがサポートされました。それ以前は`REPEATABLE READ'と`SERIALIZABLE'のみサポートされていました。




[PREVIOUS][UP][NEXT]