問題
ドキュメント1に書かれているようにAUTOCOMMITをオフにしようとしてもエラーとなってしまう。
実際に実行すると以下のようにエラーとなる。
postgres=# SET AUTOCOMMIT TO ON;
ERROR: unrecognized configuration parameter "autocommit"
postgres=#
原因
そもそもドキュメント1の見方が間違っていました・・・。
自分も勘違いしていましたが、このドキュメント1はPostgresSQLサーバーの機能のドキュメントではなく、PostgreSQLが提供するECPGというC言語向けのライブラリーのドキュメントのようです。
ECPGライブラリーがなんなのかというと、
独自構文で書いた.pgcファイルを用意し、ECPGライブラリーで.cファイルに変換することでC言語で簡単にPostgreSQLにアクセスできるライブラリーのようです。その.pgcファイルの独自構文の中の1つが「SET AUTOCOMMIT」で、さきほどのドキュメント1で解説されています。
あくまでECPGライブラリーが認識できる構文なので、どれだけpsql上で「SET AUTOCOMMIT」を打ってもエラーになるだけです。そんなコマンドはpsqlもPostgreSQLサーバーも知らないので。
英語しかないですが、ECPGの簡単な解説がwikipediaに載っていました。google翻訳をしてみるといい感じに日本語でも見れるので興味がある方はどうぞ。
https://en.wikipedia.org/wiki/ECPG
解決方法
少し調べた感じ、PostgreSQLサーバー自体にはAUTOCOMMITの切り替え機能はないようですね。AUTOCOMMITの機能はPostgreSQLクライアントで実現されているようです。
おそらくこの記事を見ている人はpsqlを使ってPostgreSQLに接続していると思いますので、psqlを使っての解決方法を紹介します。
詳しくは公式ドキュメント2を参照していただければと思いますが、2つ方法があります。
1つはセッション上で行う方法(psqlコマンド上で行う方法)、2つ目は.psqlrcファイルに書いておく方法です。
1つ目のセッション上で行う方法(psqlコマンド上で行う方法)だけ載せておくと以下のようにできます。
まず、現在の値を確認して、AUTOCOMMIT変数がonになっていることを確認します。その後、AUTOCOMMIT変数をoffにし、beginをせずにテーブルデータをDELETEします。その後、rollbackしてみると、データが戻っていることが確認できますね。
注意しないといけないのは、AUTOCOMMITはすべて大文字です。autocommitでは異なる変数を設定することになるので変更が有効になりません。注意しましょう。
postgres=# \echo :AUTOCOMMIT
on
postgres=# \set AUTOCOMMIT off
postgres=# \echo :AUTOCOMMIT
off
postgres=# select count(*) from machines ;
count
-------
150
(1 row)
postgres=# delete from machines ;
DELETE 150
postgres=# select count(*) from machines ;
count
-------
0
(1 row)
postgres=# rollback ;
ROLLBACK
postgres=# select count(*) from machines ;
count
-------
150
(1 row)
postgres=#
-
SET AUTOCOMMITが記載されているドキュメント:https://www.postgresql.jp/document/9.6/html/ecpg-sql-set-autocommit.html ↩ ↩2 ↩3 ↩4
-
psqlでAUTOCOMMITを変更する方法:https://www.postgresql.jp/docs/9.6/app-psql.html#app-psql-variables ↩