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

标签 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,但似乎此功能不再存在(我收到无法识别的配置参数错误)。

这到底是怎么回事?

最佳答案

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=>

关于sql - 事务是在 PostgreSQL 9.5.2 上自动提交的,没有更改它的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029513/

相关文章:

spring - 数据库读锁定

Django:从事务角度看 save() 和 create() 的区别

MYSQL .CSV 文件阻止 Excel 将值转换为日期

mysql - 复杂 SQL 字符串比较

postgresql - 在 PL/pgSQL 函数中检测到死锁

sql - 合并两个 SQL 查询

mysql - SQL 多重 AND 条件

php - 如何构建 SQL 查询以从两个表和一个序列化列获取数据

postgresql - 如何在 PostgreSQL 中修剪文本数组?

java - 将 @Transactional 与 hibernate 一起使用