Traffine I/O

日本語

2023-03-20

PostgreSQLにおけるトランザクション

PostgreSQLにおけるトランザクション制御

PostgreSQLでは、いくつかの重要なコマンドによってトランザクションの実行が制御されます:

  • BEGIN TRANSACTION
  • COMMIT
  • ROLLBACK

これらのコマンドは、それぞれトランザクションの開始、コミット、および取り消し操作を制御します。

BEGIN TRANSACTIONコマンド

PostgreSQLでトランザクションを管理する際には、BEGIN TRANSACTIONコマンドが出発点となります。このコマンドを使用してトランザクションを開始し、通常はINSERTUPDATEDELETEなどのデータ操作操作が続きます。

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におけるトランザクション制御コマンドは、データベースのトランザクションに対して幅広い制御を提供しますが、いくつかの制約が存在します。

特に、トランザクション制御コマンドは、INSERTUPDATEDELETEなどのデータ操作言語(DML)コマンドとのみ使用できます。CREATE TABLEDROP 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)

参考

https://www.tutorialspoint.com/postgresql/postgresql_transactions.htm

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!