PostgreSQL的psql中的AutoCommit

对于熟悉Oracle数据库SQL * Plus的人来说,当将其引入PostgreSQL数据库psql时,一个潜在的惊喜可能就是psql的默认启用的autocommit 这篇文章概述了psql对autocommit的处理以及一些相关的细微差别

默认情况下, Oracle的SQL * Plus命令行工具不会自动提交DML语句 ,并且操作员必须作为事务的一部分显式提交这些语句(或退出会话而无需回滚)。 因此,当PostgreSQL及其psql命令行工具的情况相反时,熟悉使用SQL * Plus与Oracle数据库一起工作的开发人员和管理员可能会有些惊讶。 默认情况下,自动提交在psql处于打开状态,这意味着每条语句(包括INSERTUPDATEDELETE语句之类的DML语句)在提交后都会自动提交。

PostgreSQL的psql默认启用自动提交的结果之一是不需要COMMIT语句。 当一个人尝试提交一个commit; 在启用了自动提交的psql ,显示警告级别的消息“ 没有正在进行的事务 ”。 下一个屏幕快照对此进行了演示。

PostgreSQL的psql中的AutoCommit

本文的其余部分介绍如何关闭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 )。

PostgreSQL的psql中的AutoCommit

如果希望“始终”禁用自动提交,可以将\set AUTOCOMMIT off元命令添加到本地的~/.psqlrc文件中。 要获得更全局的设置,可以将此元命令放在数据库的系统配置目录中的psqlrc文件中(可以使用PostgreSQL操作系统级别的命令pg_config --sysconfdir ,如下面的屏幕快照所示)。

PostgreSQL的psql中的AutoCommit

使用psql和处理autocommit时要警惕的最后一个细微差别是认识到show AUTOCOMMIT; 通常没有用。 在PostgreSQL 9.5中,如下面的屏幕快照所示,一条错误消息清楚地表明它不再可用。

PostgreSQL的psql中的AutoCommit

结论

尽管默认情况下在PostgreSQL数据库的psql命令行工具中启用了自动提交,但是可以使用\set AUTOCOMMIT off在会话中显式\set AUTOCOMMIT off或通过个人~/.psqlrc文件或全局系统配置psqlrc文件中的配置psqlrc提交。

翻译自: https://www.javacodegeeks.com/2016/09/autocommit-postgresqls-psql.html