19.12. 锁 Management

  • deadlock_timeout ( integer )
    • 这是 await 锁定然后检查是否存在死锁条件的时间(以毫秒为单位)。死锁检查相对昂贵,因此服务器不会在每次 await 锁时都运行死锁。我们乐观地认为死锁在生产应用程序中并不常见,只需要 await 一段时间就可以检查死锁。增大此值可减少不必要的死锁检查所浪费的时间,但会减慢实际死锁错误的报告速度。默认值为一秒(1s),这可能是您实际需要的最小值。在负载很重的服务器上,您可能需要提高它。理想情况下,设置应超过您的典型 Transaction 时间,以提高在服务员决定检查死锁之前将释放锁的几率。只有超级用户可以更改此设置。

设置为log_lock_waits时,此参数还将确定在发出有关锁定 await 的日志消息之前 await 的时间。如果您尝试调查锁定延迟,则可能需要设置比普通deadlock_timeout短的时间。

  • max_locks_per_transaction ( integer )
    • 共享锁表跟踪max_locks_per_transaction *(max_connections max_prepared_transactions)个对象(例如表)上的锁;因此,在任何时候都不能锁定这么多不同的对象。此参数控制为每个事务分配的平均对象锁数;只要所有事务的锁都适合锁定表,单个事务就可以锁定更多对象。这不是可以锁定的行数;这个价值是无限的。默认值 64 在历史上已被证明是足够的,但是如果您的查询在单个事务中涉及许多不同的表,例如,可能需要提高该值。一个有很多孩子的父表的查询。该参数只能在服务器启动时设置。

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

  • max_pred_locks_per_transaction ( integer )

    • 共享谓词锁定表跟踪max_pred_locks_per_transaction *(max_connections max_prepared_transactions)个对象(例如表)上的锁;因此,在任何时候都不能锁定这么多不同的对象。此参数控制为每个事务分配的平均对象锁数;只要所有事务的锁都适合锁定表,单个事务就可以锁定更多对象。这不是可以锁定的行数;这个价值是无限的。默认值 64 通常足以进行测试,但是如果您的 Client 端在单个可序列化事务中触摸许多不同的表,则可能需要提高该值。该参数只能在服务器启动时设置。
  • max_pred_locks_per_relation ( integer )

    • 这控制在将锁提升为覆盖整个关系之前,可以 assert 锁定单个关系的页面或 Tuples 的数量。大于或等于零的值表示绝对极限,而负值表示max_pred_locks_per_transaction除以该设置的绝对值。默认值为-2,它保持 PostgreSQL 早期版本的行为。只能在postgresql.conf文件或服务器命令行中设置此参数。
  • max_pred_locks_per_page ( integer )

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