Postgresql 中文操作指南

20.12. Lock Management #

  • deadlock_timeout (integer) #

    • 这是在检查是否存在死锁条件之前等待锁定的时间量。死锁检查相对昂贵,因此服务器不会在每次等待锁时都运行它。我们乐观地认为,死锁在生产应用程序中并不常见,并且在检查死锁之前只等待一下锁。增加此值会减少浪费在不必要的死锁检查上的时间,但会减慢对实际死锁错误的报告速度。如果此值未指定单位,则将其视为毫秒。默认值是一秒 ( 1s ),这可能是您在实践中需要的最小值。在负载很高的服务器上,您可能需要提高它。理想情况下,该设置应超过您的典型事务时间,以提高在等待者决定检查死锁之前锁被释放的几率。只有拥有适当 SET 权限的超级用户和用户才能更改此设置。

    • 当设置 log_lock_waits 后,此参数还确定在发出有关锁等待的日志消息之前要等待的时间量。如果您尝试调查锁定延迟,您可能希望设置比正常 deadlock_timeout 更短的时间。

  • max_locks_per_transaction (integer) #

    • 共享锁表为每个服务器进程或准备好的事务有 max_locks_per_transaction 个对象(例如,表)的空间;因此,任何时候都不可能锁定多于此数量的不同对象。此参数限制每个事务使用的对象锁的平均数量;只要所有事务的锁都适合锁表,个别事务可以锁定更多对象。这是 not 可以锁定的行数;该值是无限的。默认值 64 在历史上被证明是足够的,但是如果您有在单个事务中涉及许多不同表的查询(例如,包含许多子表的父表的查询),则可能需要增大此值。此参数只能在服务器启动时设置。

    • 运行备用服务器时,您必须将此参数设置为与主服务器上相同或更高的值。否则,不允许在备用服务器中进行查询。

  • max_pred_locks_per_transaction (integer) #

    • 共享谓词锁表为每个服务器进程或准备好的事务有 max_pred_locks_per_transaction 个对象(例如,表)的空间;因此,任何时候都不可能锁定多于此数量的不同对象。此参数限制每个事务使用的对象锁的平均数量;只要所有事务的锁都适合锁表,个别事务可以锁定更多对象。这是 not 可以锁定的行数;该值是无限的。默认值 64 在历史上被证明是足够的,但是如果您有客户端在单个可串行化事务中涉及许多不同的表,则可能需要增大此值。此参数只能在服务器启动时设置。

  • max_pred_locks_per_relation (integer) #

    • 这控制着在将锁提升到覆盖整个关系之前,可以对单个关系的多少页或元组进行谓词锁定。大于或等于零的值表示绝对限制,而负值表示 max_pred_locks_per_transaction 除以该设置的绝对值。默认值为 -2,它保持了 PostgreSQL 早期版本的行为。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

  • max_pred_locks_per_page (integer) #

    • 此参数控制单个页面中有多少行可以在谓词锁定之前提升为覆盖整个页面。默认值为 2。此参数只能在 postgresql.conf 文件或服务器命令行中设置。