Liquidsのロゴ Liquids

トランザクションを張る【PostgreSQL】

PostgreSQL

明示的にトランザクションを張るにはBEGINを使用します。
BEGINを使用すると、トランザクションブロックが開始し、COMMITまたはROLLBACKが使用されるまで1つのトランザクションとして継続します。

トランザクション内でエラーが発生した場合はロールバックされますし、エラー以降のSQLについても無視されます。

SQL
BEGIN; insert into sample_table values (1, 'TEST1'); insert into sample_table value (2, 'TEST2'); insert into sample_table values (3, 'TEST3'); COMMIT;
実行結果
BEGIN INSERT 0 1 psql:test.sql:4: ERROR: syntax error at or near "value" 行 1: insert into sample_table value (2, 'TEST2'); ^ psql:test.sql:5: ERROR: current transaction is aborted, commands ignored until end of transaction block ROLLBACK
実行後のテーブル
id | name ----+------ (0 rows)

以下は正常なSQLの場合です。

SQL
BEGIN; insert into sample_table values (1, 'TEST1'); insert into sample_table values (2, 'TEST2'); insert into sample_table values (3, 'TEST3'); COMMIT;
実行結果
BEGIN INSERT 0 1 INSERT 0 1 INSERT 0 1 COMMIT
実行後のテーブル
id | name ----+------- 1 | TEST1 2 | TEST2 3 | TEST3 (3 rows)

BEGINを使用しない場合、暗黙的なトランザクションが張られます。

暗黙的なトランザクションは各文で張られ、各文で暗黙的にコミットされます。

以下のようにエラーが発生しても各文はトランザクションが別なので別の文は実行されますし、コミットされます。

SQL
insert into sample_table values (1, 'TEST1'); insert into sample_table value (2, 'TEST2'); insert into sample_table values (3, 'TEST3');
実行結果
INSERT 0 1 psql:test.sql:2: ERROR: syntax error at or near "value" 行 1: insert into sample_table value (2, 'TEST2'); ^ INSERT 0 1
実行後のテーブル
id | name ----+------- 1 | TEST1 3 | TEST3 (2 rows)

トランザクションについてはPostgreSQLのドキュメントに詳しく書かれています。

BEGIN

Liquidsのロゴ Liquids

Liquidsは誰でも投稿・編集ができる技術Wikiコミュニティ📝です。

あなたもLiquidsで技術Wikiを
書いてみませんか?