事务是在PostgreSQL 9.5.2上自动提交的,没有更改选项吗?

时间:2016-05-04 13:38:00

标签: sql postgresql transactions autocommit

我刚刚设置了一个新的PostgreSQL 9.5.2,似乎我的所有交易都是自动提交的。

运行以下SQL:

CREATE TABLE test (id NUMERIC PRIMARY KEY);
INSERT INTO test (id) VALUES (1);
ROLLBACK;

会发出警告:

WARNING: there is no transaction in progress
ROLLBACK

不同的事务中,以下查询:

SELECT * FROM test;

实际上返回1的行(就好像插件已提交一样)。

我尝试关闭autocommit,但似乎此功能不再存在(我收到unrecognized configuration parameter错误。)

这到底是怎么回事?

3 个答案:

答案 0 :(得分:6)

Postgres中的

自动提交由SQL 客户端控制,而不是在服务器上。

psql中,您可以使用

执行此操作
\set AUTOCOMMIT off

详细信息见手册:
http://www.postgresql.org/docs/9.5/static/app-psql.html#APP-PSQL-VARIABLES

在这种情况下,您执行的每个语句都会启动一个事务,直到您运行commit(包括select语句!)

其他SQL客户端有其他启用/禁用自动提交的方法。

或者,您可以使用begin手动启动交易。

http://www.postgresql.org/docs/current/static/sql-begin.html

psql (9.5.1)
Type "help" for help.

postgres=> \set AUTCOMMIT on
postgres=> begin;
BEGIN
postgres=> create table test (id integer);
CREATE TABLE
postgres=> insert into test values (1);
INSERT 0 1
postgres=> rollback;
ROLLBACK
postgres=> select * from test;
ERROR:  relation "test" does not exist
LINE 1: select * from test;
                      ^
postgres=>

答案 1 :(得分:1)

\set AUTCOMMIT 'off';

off value应该是单引号

答案 2 :(得分:0)

这应该有效。 \set AUTOCOMMIT关闭。请参见下面的示例。

account_dept=# \set AUTOCOMMIT off
account_dept=# update account set ACCT_BALANCE= acct_balance + 200 WHERE ACCT_NUM=1;
UPDATE 1
account_dept=# rollback;