第 12章同時実行制御

目次
12.1. 序文
12.2. トランザクションの隔離
12.2.1. リードコミッティド隔離レベル
12.2.2. シリアライザブル隔離レベル
12.3. 明示的ロック
12.3.1. テーブルレベルロック
12.3.2. 行レベルロック
12.3.3. デッドロック
12.4. アプリケーションレベルでのデータの一貫性チェック
12.5. ロックとインデックス

本章では同時に2つ以上のセッションが同じデータにアクセスしようとした場合、PostgreSQLデータベースシステムがどう振る舞うかについて説明します。 このような状況でデータの整合性を確実に保つ一方、すべてのセッションに対して効果的なアクセスを許可するようにすることが目的です。 データベースアプリケーションを開発する方は、本章で扱われている内容を熟知していなければなりません。

12.1. 序文

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

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

MVCCの動作に簡単には適応できないアプリケーションのために、PostgreSQLではテーブルレベルおよび行レベルのロック機能も使用可能です。 とは行っても、MVCCを適切に使用すると通常ロックよりも性能が向上します。