PostgreSQL的psql中的AutoCommit
对于熟悉Oracle数据库的SQL * Plus的人来说,当将其引入PostgreSQL数据库的psql时,一个潜在的惊喜可能就是psql的默认启用的autocommit 。 这篇文章概述了psql对autocommit的处理以及一些相关的细微差别 。
默认情况下, Oracle的SQL * Plus命令行工具不会自动提交DML语句 ,并且操作员必须作为事务的一部分显式提交这些语句(或退出会话而无需回滚)。 因此,当PostgreSQL及其psql
命令行工具的情况相反时,熟悉使用SQL * Plus与Oracle数据库一起工作的开发人员和管理员可能会有些惊讶。 默认情况下,自动提交在psql
处于打开状态,这意味着每条语句(包括INSERT , UPDATE和DELETE语句之类的DML语句)在提交后都会自动提交。
PostgreSQL的psql
默认启用自动提交的结果之一是不需要COMMIT
语句。 当一个人尝试提交一个commit;
在启用了自动提交的psql
,显示警告级别的消息“ 没有正在进行的事务 ”。 下一个屏幕快照对此进行了演示。
本文的其余部分介绍如何关闭psql
中所有操作语句的自动提交。
覆盖psql
的autocommit默认值的一种经常被引用的方法是使用BEGIN关键字显式开始事务,然后psql
在提供显式提交之前不会提交。 但是,随着时间的流逝,这可能会变得有些乏味,幸运的是PostgreSQL的psql
提供了一种方便的方式来配置psql
以禁用自动提交功能。
在介绍用于在psql
禁用自动提交的简便方法之前,我将在此处指出,不要混淆ECPG的建议( C中的嵌入式SQL )。 使用ECPG时,适用于ECPG的PostgreSQL文档的“ SET AUTOCOMMIT ”部分。 尽管这仅适用于ECPG而不适用于psql
,但可能很容易不知道,因为针对Google搜索“ psql autocommit”的第一个响应就是该ECPG特定的手册页。 特定于ECPG的手册页指出该命令看起来像“ SET AUTOCOMMIT { = | TO } { ON | OFF }
SET AUTOCOMMIT { = | TO } { ON | OFF }
SET AUTOCOMMIT { = | TO } { ON | OFF }
”,并添加“默认情况下,嵌入式SQL程序未处于自动提交模式,因此需要在需要时显式发出COMMIT。” 这就像Oracle的SQL * Plus,而不是默认情况下psql
行为。
幸运的是,在psql
禁用自动提交非常容易。 只需在psql
命令提示符下输入以下内容( AUTOCOMMIT
区分大小写,并且应该全部为大写):
\set AUTOCOMMIT off
这个简单的命令禁用会话的自动提交。 可以使用以下简单的\echo
元命令确定是否启用了自动提交( AUTOCOMMIT
区分大小写,并且所有大写字母都以冒号作为前缀,表示它是一个变量):
\echo :AUTOCOMMIT
下一个屏幕快照演示了到目前为止的讨论。 它使用\echo
指示自动提交的默认性质( on
)以及如何使用\set AUTOCOMMIT
禁用它( off
)。
如果希望“始终”禁用自动提交,可以将\set AUTOCOMMIT off
元命令添加到本地的~/.psqlrc
文件中。 要获得更全局的设置,可以将此元命令放在数据库的系统配置目录中的psqlrc
文件中(可以使用PostgreSQL操作系统级别的命令pg_config --sysconfdir
,如下面的屏幕快照所示)。
使用psql
和处理autocommit时要警惕的最后一个细微差别是认识到show AUTOCOMMIT;
通常没有用。 在PostgreSQL 9.5中,如下面的屏幕快照所示,一条错误消息清楚地表明它不再可用。
结论
尽管默认情况下在PostgreSQL数据库的psql
命令行工具中启用了自动提交,但是可以使用\set AUTOCOMMIT off
在会话中显式\set AUTOCOMMIT off
或通过个人~/.psqlrc
文件或全局系统配置psqlrc
文件中的配置psqlrc
提交。
翻译自: https://www.javacodegeeks.com/2016/09/autocommit-postgresqls-psql.html