参数——超时控制
单语句超时
用得最多的是事务级设置
BEGIN;
......
SET LOCAL statement_time='100ms';
SELECT count(*) FROM a;
-- 这条SQL的执行时间超过100MS则主动退出,并回滚整个事务
SET LOCAL statement_timeout to default;
......
COMMIT;
注意:在自定义函数里面,这样子设置是无效的!!因为本意是为交互性SQL设计,如果确实需要,可以通过插件HOOK来实现
其他超时控制
-
idle_in_transaction_session_timeout
-
空闲事务超时(9.6版本才有的)
-
解释
- 先了解一组状态周期
- 连接被建立时,状态为idle,表示空闲
- 连接在执行语句时,状态为active,表示活跃
- 连接使用BEGIN开启事务后,状态为idle in transaction(针对的就是这个状态)
- 连接使用COMMIT或END提交结束事务,状态回到idle
- 当某个事务空闲(idle in transaction)超过指定时间,释放该事务及其占用的锁,连接被断开
- 先了解一组状态周期
-
默认值是0,代表禁用
-
查看全局
show idle_in_transaction_session_timeout;
-
-
lock_timeout
- 锁等待超时
- 解释
- 若语句试图在获取锁时,等待超过指定时间,则该语句被终止
- 不同于statement_timeout,这个超时只在等待锁时发生
- 默认值是0
- 代表发生锁等待时,永不超时,一直等下去
- 建议
- 官方不推荐在实例级postgresql.conf上修改
- 但官方建议值得商榷,因为如果不设置,那一个会话将会无限拉长,如果出现大量需要此锁的语句,那数据库的连接将会被打爆,影响正常的连接
- 要根据实际情况,设置成大于
deadlock_timeout且小于statement_timeout的值
- 查看全局
show lock_timeout;
-
deadlock_timeout
- 死锁检测超时间隔
- 解释
- 在一个锁上等待的总时间,超过此时间则会开启昂贵的死锁检测过程
- 默认值是1s
- 建议
- 一般设置为稍大于通常事务的执行时间(避免频繁触发)
- 查看全局
show deadlock_timeout;