Dinesh Kumar Asked: 2018-09-03 22:08:22 +0800 CST2018-09-03 22:08:22 +0800 CST 2018-09-03 22:08:22 +0800 CST 同一行可以有多少个行级锁? 772 我需要一些关于Postgres中行级锁定的见解。 在关系中的特定元组上可以并发共享锁(FOR SHARE)的数量。 将在同一个元组上有许多共享锁会导致任何性能/或数据库问题。 如果存在此类限制,如何配置它们以及建议的限制。 postgresql locking 1 个回答 Voted Best Answer a_horse_with_no_name 2018-09-03T22:54:59+08:002018-09-03T22:54:59+08:00 从手册中引用 PostgreSQL 不会在内存中记住任何有关修改行的信息,因此一次锁定的行数没有限制。但是,锁定行可能会导致磁盘写入,例如,SELECT FOR UPDATE 修改选定的行以将其标记为已锁定,因此将导致磁盘写入 (强调我的) 因此,您可能遇到的唯一性能问题是重度锁定可能导致的磁盘写入次数。 虽然系统中存在“无限”数量的行锁,但是对于单个事务可以参与锁定的对象(例如表)的数量是有限制的,这是通过max_locks_per_transaction来控制的 该属性控制一个事务可以持有锁的对象数量,而不是锁的数量。一个事务可以锁定单个表中的一百万行。然而,默认值 64 formax_locks_per_transaction意味着一个事务最多可以持有 64 个表的锁(但例如每个表中有 100 万行)。因此,如果您的交易从未触及超过 64 个表,则无需担心。 增加此值的一个常见原因是,如果您在单个事务中删除大量表,例如通过一条drop owned by current_user语句来清理数据库。
从手册中引用
(强调我的)
因此,您可能遇到的唯一性能问题是重度锁定可能导致的磁盘写入次数。
虽然系统中存在“无限”数量的行锁,但是对于单个事务可以参与锁定的对象(例如表)的数量是有限制的,这是通过max_locks_per_transaction来控制的
该属性控制一个事务可以持有锁的对象数量,而不是锁的数量。一个事务可以锁定单个表中的一百万行。然而,默认值 64 for
max_locks_per_transaction
意味着一个事务最多可以持有 64 个表的锁(但例如每个表中有 100 万行)。因此,如果您的交易从未触及超过 64 个表,则无需担心。增加此值的一个常见原因是,如果您在单个事务中删除大量表,例如通过一条
drop owned by current_user
语句来清理数据库。