引发 idle in transaction 的原因很多,例如应用代码中忘记关闭已开启的事务,或者系统中存在僵死进程等,曾经看到过某个库中的 idle in transaction 进程存在一年有余,这类进程严重危害了数据库的安全,例如它会阻止 VACUUM 进程回收记录,造成表数据膨胀,同时它有可能引起整个 PostgreSQL 数据库 Transaction ID Wraparound 的风险。--修改 postgresql.conf 以下参数idle_in_transaction_session_timeout = 20000备注:参数单位为毫秒,这里设置 idle in transaction 超时空闲事务时间为 20 秒。--重载配置文件[pg96@db1 pg_root]$ pg_ctl reloadserver signaled备注:此参数修改后对当前连接依然生效,应用不需要重连即能生效。--开启会话一:模拟一个事务[pg96@db1 ~]$ psql francs francspsql (9.6beta1)Type "help" for help.francs=> begin;BEGINfrancs=> select 1; ?column? ---------- 1(1 row)事务中,不提交也不回滚。