今回は PostgreSQL のトランザクションについて解説します。
トランザクションとは?
トランザクションとは、データベースのデータを利用する時(処理する時)に、複数の処理を一連のものとしてまとめる単位のことを言います。
例えば、Aさんの銀行の口座から、Bさんの銀行口座にお金(500円)を振り込む場合、
- Aさんの銀行口座から500円を引く
- Bさんの銀行口座に500円を足す
をワンセットで処理する必要があります。
この処理が片方だけとか、2つの足し引き処理の間に他の処理が入ると不整合が発生する可能性があります。
一連の処理がすべて問題なく行われたときは「コミット」で終了し、途中でエラーなどが発生した場合は「ロールバック」を行うことで、データベースの整合性を保ちます。
トランザクションの特徴
データベースのトランザクションには「ACID特性」と呼ばれる性質があります。
- Atomicity(原子性) ← トランザクションの処理を完全に実行されるか、一切実行されないか、0か1かの性質
- Consistency(整合性) ← トランザクションの実行前後でデータの整合性が担保される性質
- Isolation(分離性) ← トランザクションの処理が他のトランザクションの処理に影響を与えない性質
- Durability(持続性) ← トランザクションのコミットが確実に保存される性質
トランザクションのコマンド
- BEGIN ← トランザクションの開始します。
- START TRANSACTION ← トランザクションの開始します。
- COMMIT ← コミットしてトランザクションの終了します。
- END ← コミットしてトランザクションの終了します。
- ROLLBACK ← トランザクションを途中停止し処理を最初からすべて取り消します。
- ABORT ← トランザクションを途中停止し処理を最初からすべて取り消します。
ROLLBACK と ABORT はトランザクションの開始からの処理をすべて取り消します。
しかしセーブポイント(SAVEPOINT)で一部のみ保存することができます。
トランザクションの SQL コマンドの反映のタイミング
1つのトランザクションが、BEGIN コマンドで開始された場合、その後の各 SQL コマンド(SQL 文)は COMMIT コマンドでトランザクションが終了することにより初めて反映されます。
自動コミットがONの場合(autocommit が有効)
ただし、「自動コミット」が「ON」になっている場合は、SQL コマンドが実行されたタイミングで反映されます。
PostgreSQL ではデフォルトで「autocommit」が「有効」になっているので、BEGIN コマンドなどで明示的にトランザクションを開始していない限りは SQL 文を実行するごとにコミットされます。
トランザクションの分離レベル
トランザクションの分離レベルとは、他にもトランザクションが実行されていた場合にどれくらい影響を受けるのかをレベルにしたものです。
■PostgreSQL で設定できる分離レベル
- READ UNCOMMITTED
- READ COMMITED(デフォルト)
- REPEATABLE READ
- SERIALIZABLE
■デフォルトの postgresql.conf ファイル
-bash-4.2$ less postgresql.conf
~ 省略 ~
#check_function_bodies = on COMMITTED」に設定されています。 #default_transaction_read_only = off |
トランザクション時に発生する現象
現象としては以下の3つがあります。
トランザクションの分離レベルに応じて以下の3つの現象を防ぐことができます。
- DIRTY READ ← あるデータを複数回読み込んだ時に、他トランザクションのコミット前のデータを読み込む現象です。
- FAZZY READ ← あるデータを複数回読み込んだ時に、他トランザクションのコミット(変更・削除)により取得されるデータ内容が変わる現象です。
- PHANTOM READ ← あるデータを複数回読み込んだ時に、以前は取得されなかったデータが取得されてしまう現象です。
トランザクションの開始(BEGIN or START TRANSACTION)
新しいトランザクションを開始します。
BEGIN と START TRANSACTION は同様です。
トランザクションの停止(ABORT or ROLLBACK)
ABORT で現在のトランザクションをアボート(停止)できます。
現在実行中のトランザクションはロールバックされ、そのトランザクションで行われた更新はすべて元の状態に戻されます。
※ABORT コマンドは ROLLBACK コマンドと一緒です。
トランザクションを確定する(COMMIT or END)
COMMIT と END はトランザクションを確定(コミット)します。
ロックモード
PostgreSQL にはデータに対する同時アクセスを制御(排他制御)するための様々なロックがあります。
明示的ロック(テーブルレベルロック、行レベルロック、ページレベルロック、デッドロック)
PostgreSQL シリーズ
今まで学習した PostgreSQL の技術をシリーズとしてまとめました。
【PostgreSQL】PostgreSQL の特徴と基本【Part.1】
【PostgreSQL】【正規化】リレーショナルデータベース(RDMS)の基本【Part.2】
【PostgreSQL】PostgreSQL のインストールと初期設定【Part.3】
【PostgreSQL】PostgreSQL の標準付属ツールの説明とコマンド手順【Part.4】
【PostgreSQL】PostgreSQL の設定ファイル(postgresql.conf、pg_hba.conf)の解説【Part.5】
【PostgreSQL】PostgreSQL のバックアップ手順とリストア手順【Part.6】
【PostgreSQL】PostgreSQL の運用管理(ユーザー管理、バキューム)【Part.7】
【PostgreSQL】PostgreSQL の基本的な SQL文 とオブジェクトについて【Part.8】
【PostgreSQL】PostgreSQL の組み込み関数、ユーザー定義関数、演算子について【Part.9】
【PostgreSQL】PostgreSQL のトランザクションについて【Part.10】
【PostgreSQL】SQL文【Part.11】
【PostgreSQL】テーブル設計(データ型、制約)【Part.12】
コメント