19.12. 锁管理
-
deadlock_timeout
(integer
) -
这是进行死锁检测之前在一个锁上等待的总时间(以毫秒计)。死锁检测相对昂贵,因此服务器不会在每次等待锁时都运行这个它。我们乐观地假设在生产应用中死锁是不常出现的,并且只在开始检测死锁之前等待一会儿。增加这个值就减少了浪费在无用的死锁检测上的时间,但是减慢了报告真正死锁错误的速度。默认是 1 秒(
1s
),这可能是实际中你想要的最小值。在一个高负载的服务器上,你可能需要增大它。这个值的理想设置应该超过你通常的事务时间,这样就可以减少在锁释放之前就开始死锁检查的机会。只有超级用户可以更改这个设置。当log_lock_waits被设置时,这个参数还可以决定发出关于锁等待的日志之前等待的时长。如果你想调查锁延迟,你可能希望设置一个比正常的
deadlock_timeout
小的值。 -
max_locks_per_transaction
(integer
) -
共享锁表跟踪在
max_locks_per_transaction
* (max_connections + max_prepared_transactions) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这not是能被锁住的行数,那个值是没有限制的。默认值 64 已经被历史证明是足够的,但是如果你有需要在一个事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。这个参数只能在服务器启动时设置。当运行一个后备服务器时,你必须设置这个参数为大于等于主服务器上的值。否则,后备服务器上将不允许查询。
-
max_pred_locks_per_transaction
(integer
) -
共享谓词锁表跟踪在
max_pred_locks_per_transaction
* (max_connections + max_prepared_transactions) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这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
文件或服务器命令行中设置。 -
本文转自PostgreSQL中文社区,原文链接: 19.12. 锁管理