Chapter 9. 同時実行制御

Table of Contents
9.1. 序文
9.2. トランザクションの隔離
9.2.1. リードコミッティド隔離レベル
9.2.2. シリアライザブル隔離レベル
9.3. 明示的ロック
9.3.1. テーブルレベルロック
9.3.2. 行レベルロック
9.3.3. デッドロック
9.4. アプリケーションレベルでのデータの一貫性チェック
9.5. ロックとインデックス

この章では、PostgreSQL データベースシステムにおいて、 2 つ以上のセッションが同時に同じデータにアクセスしようとした場合の動作について、説明しています。 このような状況になった場合、データ整合性を厳密に保ちながら、すべてのセッションに対して効率的なアクセスを可能にすることを目的としています。 データベースアプリケーションの開発者は、本章で扱われている内容を熟知している必要があります。

9.1. 序文

伝統的なデータベースシステムでは、同時実行制御のためにロック機構を使用していますが、PostgreSQL ではデータ整合性の維持に多版方式 (多版型同時実行制御 (Multiversion Concurrency Control) MVCC) を使用しています。つまり、データベースへの問い合わせ実行の際、各トランザクションは処理の基礎となっているデータの現在の状態を関知せず、現在から遡ったある時点におけるスナップショット(データベースバージョン)を参照する、というものです。これは、並行する(別の)トランザクションが同じ行を更新することによって引き起こる、整合性を欠いたデータの参照からトランザクションを保護し、個々のデータベースセッションに対してトランザクションの隔離を提供するものです。

多版方式とロック方式との最大の相違点は、MVCCでは問い合わせ(読み込み)ロックの獲得と、書き込みロックの獲得が競合しないことです。 したがって、読み込みは書き込みを絶対にブロックしませんし、書き込みも読み込みをブロックすることがありません。

MVCC の動作に簡単には適応できないアプリケーションのために、PostgreSQL ではテーブルレベルおよび行レベルのロック機能も使用可能です。 しかし、MVCC を適切に使用すると、通常ロックよりも良いパフォーマンスが得られます。