首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >页级锁会导致试图锁定同一页上两个不同行的两个事务之间的死锁吗?

页级锁会导致试图锁定同一页上两个不同行的两个事务之间的死锁吗?
EN

Stack Overflow用户
提问于 2020-09-01 11:18:26
回答 1查看 76关注 0票数 0

根据postgres docs第13.3.2节

除了表锁和行锁之外,还使用页级共享/排他锁控制对共享缓冲池中表页的读/写访问。这些锁在获取或更新行后立即释放。应用程序开发人员通常不需要关注页面级别的锁,但是为了完整起见,这里提到了它们。

我的理解是,我不需要担心我的事务是否足够大,以至于它们可能锁定足够长的行,以致于发生这样的情况: T1对P1上的R1有一个锁,并且希望在P2上锁定R2,但是不能这样做,因为T2在P2上有一个R3上的锁,并且在获得R4 on P1上的锁之前不会释放它。

T ->事务 P ->页面 R ->行

这个假设是正确的,还是我应该使我的交易足够短,这样的锁是不太可能发生?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 11:34:48

无论您的事务处理需要多长时间,页面级别的锁总是保持很短的时间。与其他锁不同的是,当不再需要锁时,它们会在提交之前立即释放。

此外,页面锁的使用方式总是不能参与死锁(除非PostgreSQL有错误)。

详细信息:

页面锁是使用LockPage函数在src/backend/storage/lmgr/lmgr.c中获取的。目前,它们只在索引清理期间与GIN索引一起使用,当挂起列表集成到主索引(函数ginInsertCleanup in src/backend/access/gin/ginfast.c)中时:元数据被锁定以防止函数的并发执行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63686618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档