【发布时间】:2020-09-01 11:18:26
【问题描述】:
根据postgres docs section 13.3.2
除了表和行锁,页级共享/排他锁 用于控制对共享表页的读/写访问 缓冲池。这些锁在一行被释放后立即释放 获取或更新。应用程序开发人员通常不需要 与页级锁有关,但在这里提到它们是为了 完整性。
我的理解是,我不必担心我的事务是否足够大,以至于它们可能会锁定足够长的行,以至于会发生以下情况:T1 在 P1 上锁定了 R1,并希望在 P2 上锁定 R2,但不能这样做因为 T2 在 P2 上的 R3 上有一个锁,直到它在 P1 上的 R4 上获得一个锁才会释放它。
T -> 交易
P -> 页面
R -> 行
这个假设是否正确,或者我应该使我的事务足够短以降低发生这种锁定的可能性?
【问题讨论】:
-
我的理解是,当页面数据被访问在内存中时,这些页面锁只会在很短的时间内被持有。它们不会在交易期间保留,也不会应用于磁盘上的块。
-
根据您的回复和@Laurenz Albe 的回复,我非常有信心是这种情况,但现在我有兴趣找到更多关于这些页面锁如何工作的信息,除了代码本身之外,似乎没有官方资源。你们有谁知道我可以检查的任何内部设计规范吗?