PostgreSQLにおけるトランザクション制御
PostgreSQLでは、いくつかの重要なコマンドによってトランザクションの実行が制御されます:
BEGIN TRANSACTION
COMMIT
ROLLBACK
これらのコマンドは、それぞれトランザクションの開始、コミット、および取り消し操作を制御します。
BEGIN TRANSACTIONコマンド
PostgreSQLでトランザクションを管理する際には、BEGIN TRANSACTION
コマンドが出発点となります。このコマンドを使用してトランザクションを開始し、通常はINSERT
、UPDATE
、DELETE
などのデータ操作操作が続きます。
BEGIN
またはBEGIN TRANSACTION
コマンドでトランザクションを開始すると、システムはトランザクションブロックに入り、その後の全てのデータベース操作がトランザクションの一部となります。このトランザクションは、次のCOMMIT
またはROLLBACK
コマンドに遭遇するまで続きます。データベース接続が閉じられた場合やエラーが発生した場合にも、トランザクションは自動的にロールバックされます。
BEGIN;
または
BEGIN TRANSACTION;
COMMITコマンド
トランザクションで必要な変更を行った後は、COMMIT
コマンドを使用してこれらの変更をデータベースに保存します。これにより、トランザクションで行われた全ての変更が保存され、他のトランザクションからも参照できるようになります。また、トランザクションブロックの終了もマークされます。
COMMIT
またはEND TRANSACTION
コマンドを発行すると、前回のCOMMIT
またはROLLBACK
コマンド以降にデータベースに対して行われた全ての変更が保存されます。
COMMIT;
または
END TRANSACTION;
ROLLBACKコマンド
エラーやその他の理由によりトランザクションをキャンセルする必要がある場合は、ROLLBACK
コマンドが便利です。このコマンドは、データベースにまだ保存されていないトランザクションによって行われた全ての変更を取り消します。
ROLLBACK
コマンドは、最後のCOMMIT
またはROLLBACK
コマンドが発行されてからのトランザクションのみを取り消します。
ROLLBACK;
トランザクション制御の制約
PostgreSQLにおけるトランザクション制御コマンドは、データベースのトランザクションに対して幅広い制御を提供しますが、いくつかの制約が存在します。
特に、トランザクション制御コマンドは、INSERT
、UPDATE
、DELETE
などのデータ操作言語(DML)コマンドとのみ使用できます。CREATE TABLE
やDROP TABLE
などのデータ定義言語(DDL)コマンドを実行する際には適用されません。これは、PostgreSQLではDDLコマンドが自動的にコミットされるため、ロールバックすることができないためです。
実例デモンストレーション
次のレコードを持つ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
ROLLBACK
トランザクションを開始し、age = 25
のレコードを削除します。そして、ROLLBACK
コマンドを使用して全ての変更を取り消します。
postgres=# 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
これは、トランザクションをロールバックし、以前に行った削除操作が元に戻されたためです。
COMMIT
次に、別のトランザクションを開始し、再度age = 25
のレコードを削除しますが、今回はCOMMIT
コマンドを使用して全ての変更を保存します。
postgres=# 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)
参考