PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

19.12. 锁管理与死锁超时设置 #

deadlock_timeout (integer) #

这是在检查是否存在死锁条件之前在一个锁上等待的时间量。 死锁检查相对昂贵,因此服务器不会在每次等待锁时都运行它。 我们乐观地假定死锁在生产应用程序中并不常见, 因此只在锁上等待一段时间之后再检查死锁。 增大这个值会减少在无谓的死锁检查上浪费的时间, 但会拖慢对真实死锁错误的报告。 如果这个值没有指定单位,则以毫秒为单位。 默认值为一秒(1s), 这可能是实践中你想要的最小值。 在负载很重的服务器上你可能想调高它。 理想情况下,这个设置应当超过你的典型事务时长, 以提高在等待者决定检查死锁之前锁已被释放的几率。 只有超级用户和具有相应 SET 权限的用户可以更改这个设置。

当 log_lock_waits 被设置时, 这个参数还决定在发出一条关于锁等待的日志消息之前等待的时间 量。 如果你正在尝试调查锁延迟, 你可能想把 deadlock_timeout 设置为比正常值更短的值。

max_locks_per_transaction (integer) #

共享锁表为每个服务器进程或已准备事务预留了 max_locks_per_transaction 个对象(例如表)的空间; 因此,任一时刻能被锁定的不同对象不会多于这个数量。 这个参数限制每个事务使用的对象锁的平均数量; 只要所有事务的锁都能放进锁表, 个别事务可以锁定更多的对象。 这不是能被锁定的行数; 那个值是没有限制的。 默认值 64 经历史证明已经足够, 但如果你有在单个事务中接触许多不同表的查询, 例如查询一个有许多子表的父表, 你可能需要调高这个值。 这个参数只能在服务器启动时设置。

当运行一台备用服务器时,你必须把这个参数设置为与主服务器上 相同或更高的值。 否则,备用服务器上将不允许执行查询。

max_pred_locks_per_transaction (integer) #

共享谓词锁表为每个服务器进程或已准备事务预留了 max_pred_locks_per_transaction 个对象(例如表)的空间; 因此,任一时刻能被锁定的不同对象不会多于这个数量。 这个参数限制每个事务使用的对象锁的平均数量; 只要所有事务的锁都能放进锁表, 个别事务可以锁定更多的对象。 这不是能被锁定的行数; 那个值是没有限制的。 默认值 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 文件中或服务器命令行上 设置。