Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

参数——超时控制

单语句超时

用得最多的是事务级设置

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;