分離レベルは、同じトランザクションを同時に使用する間に何が発生するかを定義します。この設定をはデータベース上でのみ変更できます。設定できる分離レベルは使用するDBMSによって異なります。
MS-SQL Server
0 READ UNCOMMITTED(共有ロックは実行されず、排他ロックも使用されません。このオプションが設定されている場合には、コミットされていないデータ、つまりダーティ データを読み取ることができます。トランザクションが終了する前にデータ内の値を変更でき、行がデータ セットに現れたり消えたりします。)
1 READ COMMITTED(データが読み取られている間、ダーティ リードを回避するために共有ロックが保持されるように指定します。しかし、トランザクションが終了する前にデータを変更することができるので、反復不能読み取りやファントム データが発生する可能性があります。)
DB2 UDB
0 非コミット読み取り(UR:アプリケーションが他のトランザクションの非コミット変更にアクセスするのを可能にします。 他のアプリケーションが表を消去または変更しようとしない限り、アプリケーションは自分が読み取っている行以外のアプリケーションをロックしません。)
1 カーソル固定(CS:カーソルが任意の行上に置かれている時に、アプリケーションのトランザクションがアクセスするその行をロックします。 次の行が取り出されるか、またはトランザクションが終了するまで、そのロックは有効のままになります。行内のいずれかのデータが変更された場合、データベースに対してその変更内容がコミットされるまでロックは保持されます。)
2 読み取り固定(RS:アプリケーションがトランザクション中に検索する行のみをロックします。 行の読み取りの修飾がトランザクションが完了するまで他のアプリケーション・プロセスによって変更されないようにします。また、他のアプリケーション・プロセスによって変更された行の読み取りは、変更がプロセスによってコミットされるまで行われません。)
3 反復可能読み取り(RR:トランザクション中に参照される、アプリケーション内の行全てをロックします。 プログラムが反復可能読み取り保護を使用する場合、プログラムによって参照される行は、そのプログラムが現行のトランザクションを終了しない限り他のプログラムによって変更できません。)
Oracle
指定は無効です。
分離レベルによって発生する現象
分離レベルによって発生する現象には以下のものがあります。
ダーティリード トランザクション処理において、あるトランザクションが更新されている最中に、他のトランザクションからデータを読み出すことができてしまう現象です。ダーティーリードを禁止すると一貫性は向上しますが、オーバーヘッドを生じさせてしまうことになり、アプリケーションの実行速度を低下させてしまいます。同様に、システムの平行性を低下させてしまうことがあります。
反復不可能なリード 1度目と2度目の読み込みの間にトランザクションをコミットすると,1度目に読み込んだ内容と2度目に読み込んだ内容が異なる可能性があります。このように,複数回の読み込みの結果が,ほかのトランザクションのコミットのタイミングによって変わってくる現象です。反復不可能なリードでは一貫性は向上しますが、並行性は低下します。
ファントム 2回の読み込みの間にユーザー1のトランザクションが行を追加したり削除したら,2回目の読み込みでは1回目には無かったレコードが現れたり,それまであったレコードが無くなったりすることになります。この現象を「ファントム」と呼びます。
各分離レベルは、許容する現象によって異なります。以下の表は分離レベルとトランザクション処理を同時実行させた場合に起こる問題の相関関係を示しています。
# |
分離レベル/現象 |
ダーティーリード |
反復不可能読み取り |
ファントム |
0 |
READUNCOMMITTED |
X |
X |
X |
1 |
READCOMMITTED |
|
X |
X |
2 |
読み取り固定 |
|
X |
X |
3 |
反復可能読み取り |
|
|
|