PostgreSQL-トランザクション
トランザクションは、データベースに対して実行される作業単位です。トランザクションは、ユーザーが手動で行う場合でも、ある種のデータベースプログラムによって自動的に行う場合でも、論理的な順序で実行される作業の単位またはシーケンスです。
トランザクションとは、データベースへの1つ以上の変更の伝播です。たとえば、レコードを作成する場合、レコードを更新する場合、またはテーブルからレコードを削除する場合は、テーブルでトランザクションを実行しています。データの整合性を確保し、データベースエラーを処理するには、トランザクションを制御することが重要です。
実際には、多くのPostgreSQLクエリをグループにまとめ、トランザクションの一部としてそれらすべてを一緒に実行します。
トランザクションのプロパティ
トランザクションには次の4つの標準プロパティがあり、通常は頭字語ACID-と呼ばれます。
Atomicity−ワークユニット内のすべての操作が正常に完了したことを確認します。それ以外の場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
Consistency −トランザクションが正常にコミットされると、データベースの状態が適切に変更されるようにします。
Isolation −トランザクションが互いに独立して透過的に動作できるようにします。
Durability −システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続することを保証します。
トランザクション制御
次のコマンドは、トランザクションを制御するために使用されます-
BEGIN TRANSACTION −トランザクションを開始します。
COMMIT −変更を保存するには、代わりに次を使用できます END TRANSACTION コマンド。
ROLLBACK −変更をロールバックします。
トランザクション制御コマンドは、DMLコマンドのINSERT、UPDATE、およびDELETEでのみ使用されます。これらの操作はデータベースで自動的にコミットされるため、テーブルの作成中または削除中には使用できません。
BEGINTRANSACTIONコマンド
トランザクションは、BEGINTRANSACTIONまたは単にBEGINコマンドを使用して開始できます。このようなトランザクションは通常、次のCOMMITまたはROLLBACKコマンドが検出されるまで持続します。ただし、データベースが閉じられた場合、またはエラーが発生した場合、トランザクションもロールバックします。
以下は、トランザクションを開始するための簡単な構文です。
BEGIN;
or
BEGIN TRANSACTION;
COMMITコマンド
COMMITコマンドは、トランザクションによって呼び出された変更をデータベースに保存するために使用されるトランザクションコマンドです。
COMMITコマンドは、最後のCOMMITまたはROLLBACKコマンド以降のすべてのトランザクションをデータベースに保存します。
COMMITコマンドの構文は次のとおりです-
COMMIT;
or
END TRANSACTION;
ROLLBACKコマンド
ROLLBACKコマンドは、データベースにまだ保存されていないトランザクションを元に戻すために使用されるトランザクションコマンドです。
ROLLBACKコマンドは、最後のCOMMITまたはROLLBACKコマンドが発行されてからのトランザクションを元に戻すためにのみ使用できます。
ROLLBACKコマンドの構文は次のとおりです-
ROLLBACK;
例
考えてみましょうCOMPANYのテーブルには、次のレコードを持っています-
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
ここで、トランザクションを開始し、age = 25のテーブルからレコードを削除し、最後にROLLBACKコマンドを使用してすべての変更を元に戻します。
testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;
COMPANYテーブルにまだ次のレコードがあることを確認する場合-
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
ここで、別のトランザクションを開始し、age = 25のテーブルからレコードを削除し、最後にCOMMITコマンドを使用してすべての変更をコミットします。
testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;
COMPANYテーブルを確認すると、まだ次のレコードがあります-
id | name | age | address | salary
----+-------+-----+------------+--------
1 | Paul | 32 | California | 20000
3 | Teddy | 23 | Norway | 20000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
(5 rows)