除了表锁和行锁之外,还使用页级共享/排他锁控制对共享缓冲池中表页的读/写访问。这些锁在获取或更新行后立即释放。应用程序开发人员通常不需要关注页面级别的锁,但是为了完整起见,这里提到了它们。
我的理解是,我不需要担心我的事务是否足够大,以至于它们可能锁定足够长的行,以致于发生这样的情况: T1对P1上的R1有一个锁,并且希望在P2上锁定R2,但是不能这样做,因为T2在P2上有一个R3上的锁,并且在获得R4 on P1上的锁之前不会释放它。
T ->事务 P ->页面 R ->行
这个假设是正确的,还是我应该使我的交易足够短,这样的锁是不太可能发生?
发布于 2020-09-01 11:34:48
无论您的事务处理需要多长时间,页面级别的锁总是保持很短的时间。与其他锁不同的是,当不再需要锁时,它们会在提交之前立即释放。
此外,页面锁的使用方式总是不能参与死锁(除非PostgreSQL有错误)。
详细信息:
页面锁是使用LockPage函数在src/backend/storage/lmgr/lmgr.c中获取的。目前,它们只在索引清理期间与GIN索引一起使用,当挂起列表集成到主索引(函数ginInsertCleanup in src/backend/access/gin/ginfast.c)中时:元数据被锁定以防止函数的并发执行。
https://stackoverflow.com/questions/63686618
复制相似问题