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

■2-07■ トランザクションの隔離とは



トランザクションの隔離

“トランザクションの隔離”とは、トランザクション間で影響を与え合わないように、それぞれについて分離独立した状態を作って処理の一貫性を保証することです。
もしも、トランザクションの隔離を行わずに複数のトランザクションを並行して実行すると、次のような問題が起こる可能性があります。


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

    図.2-9 ダーティリード
    
    

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

    図.2-10 反復不能読み取り
    
    

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

    図.2-11 ファントムリード
    
    


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

表.2-2 隔離レベルと問題に対する効果
隔離レベル ダーティリード 反復不能読み取り ファントムリード PostgreSQLサポート
READ UNCOMMITTED 可能性あり 可能性あり 可能性あり
READ COMMITTED 安全 可能性あり 可能性あり サポート(デフォルト)
REPEATABLE READ 安全 安全 可能性あり
SERIALIZABLE 安全 安全 安全 サポート

これらの隔離レベルのうち、PostgreSQLは次の2つのトランザクション隔離レベルが設定可能です。

・READ COMMITTED 
・SERIALIZABLE 

補足


(1)
PostgreSQLではダーティーリードは発生しません(デフォルトのトランザクションの隔離レベルが“READ COMMITTED”だから)。

(2)
PostgreSQLとOracle は“READ COMMITTED”と“SERIALIZABLE”のみサポートしています。例えば、DB2などは4つの隔離レベルすべてをサポートしています。隔離レベル“READ UNCOMMITTED”と“REPEATABLE READ”が有用か否かは、Oracleと他の市販DBMS陣営間で論争の種になっています。

[PREVIOUS][UP][NEXT]