两个开启AUTOCOMMIT的PostgreSQL库执行commit仅一台提示无进行中事务
问题原因及排查方案
该差异由PostgreSQL服务端消息配置、DBeaver客户端连接配置两个维度的差异导致,对应控制项和排查方法如下:
核心控制配置
1. 服务端参数 client_min_messages
这个参数决定了PostgreSQL服务端会向客户端返回的最低消息级别,从低到高的优先级为:DEBUG5 < DEBUG4 < DEBUG3 < DEBUG2 < DEBUG1 < LOG < NOTICE < WARNING < ERROR
- 「there is no transaction in progress」属于
NOTICE级别的通知消息 - 如果实例
client_min_messages设置为NOTICE或更低级别,服务端会返回该提示;如果设置为WARNING及更高级别,该类通知会被直接过滤,不会发送给客户端 - 查看当前参数值命令:
SHOW client_min_messages; - 临时修改当前会话生效命令:
SET client_min_messages = 'warning'; - 永久生效需修改
postgresql.conf中对应参数后执行SELECT pg_reload_conf();重载配置
2. DBeaver客户端连接配置
你在psql中通过\echo :AUTOCOMMIT查到的是psql客户端自身的自动提交配置,不代表DBeaver连接的事务配置,两个连接可能存在以下差异:
- 连接级别的自动提交开关不一致:右键对应连接→「编辑连接」→「事务」页可查看,DBeaver的自动提交配置会覆盖数据库默认参数
- 消息显示配置不一致:在DBeaver设置→「结果集」→「服务端输出」中,检查是否勾选了隐藏NOTICE级别的消息,不同连接的高级配置可能存在差异
验证方法
在返回提示的数据库连接的DBeaver查询窗口执行SET client_min_messages = 'warning';,再执行commit;,如果提示消失即可确认是服务端消息级别配置导致的差异。
内容的提问来源于stack exchange,提问作者PainIsAMaster
相关产品推荐
相关产品推荐

