我对 postgresql 还不熟悉。我查看了文档,但找不到任何有关如何进行页面级锁定的信息。
我知道我可以将表设置为这样的锁定模式:LOCK TABLE myTable IN LOCKMODE ROW EXCLUSIVE;
我该如何为我的会话实现页面级锁定?如果我对基础知识有误解,请告诉我。
答案1
为什么你会想执行显式页面级锁定?您无法控制每个页面上的内容,因此您将锁定一些任意数据集合。这样做有什么用处?
我想你正在寻找行级锁定,这是使用SELECT ... FOR UPDATE
或完成的SELECT ... FOR SHARE
。
PostgreSQL 会在可序列化快照谓词跟踪、缓冲区管理等几个地方将行级锁内部升级为页级锁。当行级锁过多并成为性能问题时,它会这样做。您无需关心这一点,因为这在 SQL 级别几乎不会对您产生任何影响。据我所知,普通行锁(如由、、等获取的)UPDATE
从未升级为页级锁,因为这样做会增加死锁的可能性。DELETE
SELECT ... FOR UPDATE
SELECT ... FOR SHARE
如果您确实确信您需要页面级锁定,请详细解释您要解决的问题以及为什么行级或表级锁定无法完成这项工作。
看:
- 显式锁定 - PostgreSQL 手册
SELECT ... FOR [UPDATE|SHARE]
- 行级锁定LOCK
- 表级锁定- PostgreSQL 中的锁定是关于锁定的更高级的讨论