4種類の分離レベルの中で,1番ゆるい分離レベルが「リードアンコミッティド」です。ここの説明で使用する『ゆるい』と言うのは,それだけほかのトランザクションからの影響を受けやすいという意味です。よってリードアンコミッティドは,4つの分離レベルの中で一番ほかのトランザクションからの影響を受けやすい分離レベルと言うことです。

 では連載第1回で説明したテーブルトランザクションにおいて,トランザクション2の分離レベルをリードアンコミッティドに設定したとします。図1のケースではどのようになるのか,説明しましょう。

図1●リードアンコミッティドの実行例(ダーティーリード発生)
図1●リードアンコミッティドの実行例(ダーティーリード発生)
[画像のクリックで拡大表示]

 トランザクション2内のSQL文1により取得される商品Aの価格は,もちろん値上げ前の価格3000円です。そうなると,トランザクション2のSQL文3で取得する商品Bの価格も値上げ前の価格を取得してほしいところです。ただ,トランザクション1とトランザクション2のそれぞれのSQL文を時系列に見ていくと,商品Bの価格を取得する前に,トランザクション1のSQL文2によって,商品Bの価格を更新しています。このようなケースにおいて,トランザクション2の分離レベルがリードアンコミッティドの場合,SQL文3で取得する商品Bの価格は値上げ後の値を取得することになります。

ROLLBACKされるかもしれないデータを取得

 トランザクション2のSQL文2で取得する(値上げ後の)価格は,トランザクション1の確定(COMMIT)すら行われていない非常に不安定な値です。トランザクション2のSQL文3で値を取得した後,トランザクション1が取り消されてしまう(ROLLBACK)可能性もあるのです。このような,自分自身以外のほかのトランザクション(今回の場合トランザクション1)で実行されたSQL文の更新結果を,そのトランザクションがCOMMITすらされていないにもかかわらず,読み込んでしまう(今回の場合トランザクション2が)現象を,『ダーティーリード』と呼びます(図2)。

図2●ダーティーリードのイメージ
図2●ダーティーリードのイメージ

 リードアンコミッティドは,このダーティーリードが発生してしまうほど,トランザクション間の独立性が無い分離レベルなのです。よって,少なくとも今回の例で使用している2つのトランザクション間において,リードアンコミッティド分離レベルで実行してはいけないことが分かると思います。

 また違う側面から見ると,リードアンコミッティド分離レベルは,他のトランザクションの動作状態を全く気にせず動作することが可能な分離レベルと言う見方もできます。RDBMSから見れば,ほかの事を気にせずそのトランザクションを実行できるので,複数トランザクションの同時実行性能が良いと言う側面もあります。

 ただし,ダーティーリードが発生しても問題のないトランザクションと言うのは,実際のアプリケーションでは,ちょっと考えにくいと思います。よって,そもそもこのリードアンコミッティド分離レベルをサポートしていないRDBMSも多く見かけます。皆さんが使用しているRDBMSはどうでしょうか。


藤塚 勤也(ふじづか きんや)
NTTデータ 基盤システム事業本部
オープンソース開発センタ 技術開発担当
シニアスペシャリスト
 沖電気工業,タンデムコンピューターズ(現日本HP)を経て,2003年より株式会社 NTTデータに勤務。現在は,オープンソース・ソフトウエアを活用したエンタープライズ・システム向けの技術開発・技術支援に従事しており,特にシステムの中核であるRDBMSに注力している。「RDBMS解剖学」(翔泳社)を共著