当前位置: 首页 > 知识库问答 >
问题:

页面级锁定会导致尝试锁定同一页面上 2 个不同行的 2 个事务之间死锁吗?

濮俊美
2023-03-14

根据postgres文档第13.3.2节

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

我的理解是,我不需要担心我的事务是否足够大,以至于它们可以锁定足够长的行,以至于T1在P1上的R1上有一个锁,并且想要锁定P2上的R2,但不能这样做,因为T2在P2上的R3上有一个锁,并且它不会释放它,直到它在P1上的R4上获得锁。

T -

这个假设是正确的,还是我应该让我的交易足够短,以至于这种锁不太可能发生?

共有1个答案

栾英资
2023-03-14

无论您的交易需要多长时间,页面级锁定始终会保持很短的时间。与其他锁不同,它们在提交之前释放,当不再需要它们时立即释放。

而且,页锁总是以不能参与死锁的方式被获取(除非PostgreSQL有bug)。

使用< code > src/back end/storage/lmgr/lmgr . c 中的< code>LockPage函数获取页锁。目前,它们仅在索引清理期间与GIN索引一起使用,此时挂起列表被集成到主索引中(函数< code > src/back end/access/GIN/GIN fast . c 中的< code>ginInsertCleanup):元页面被锁定以防止函数的并发执行。

 类似资料:
  • 我在服务层内部编写了一个更新方法,就像这样,我对所有的CRUD操作都使用Spring-data JpaRepository。 我想对此操作进行乐观锁定,因此我在 实体中添加了一个版本字段。

  • 在我的程序中,我有一个互斥锁和两个线程。其中一个线程经常获取锁。另一个线程试图获取,但必须永远等待。 是否会因为释放锁后很快就获得了锁,而另一个线程没有机会获得锁?互斥总是给每个人一个机会吗?如果不是,什么是好的解决方案?(某种FIFO锁?) 我使用的是std::mutex和std::lock\u guard 问题扩展seccpur指出,std::condition\u变量可以解决这个问题。三个线

  • 我需要在账户之间实现一些基本的资金转移逻辑。为了保持转账的一致性,我利用了同步锁。 这是帐户对象: 这是在transfer worker类中: 我的问题是,如果source Account没有足够的资金,我计划等待该线程,直到它从其他运营中获得资金。对于这个,我一直在等待源帐户。但它以死锁告终,因为目标帐户锁仍在我的帐户上。我怎样才能做到这一点?你能告诉我解决这个问题的正确方法吗? 这就是我试图推

  • 我试图使用C++11的std::condition_variable,但是当我试图从第二个线程锁定与其关联的unique_lock时,我得到一个异常“资源死锁已避免”。创建它的线程可以锁定和解锁它,但不能锁定第二个线程,即使我非常肯定unique_lock不应该在第二个线程试图锁定它的地方已经锁定。 FWIW我在Linux中使用gcc4.8.1和-std=gnu++11。 我已经围绕conditi

  • 问题内容: 我尝试弄清楚当我需要固定(页面锁定)内存时,CUDA(或OpenCL实现)是否能说明问题。 我尝试查看了和的值,并且都保持为0且从未上升(报告也为0)。我曾经使用过页面锁定内存,并且值按预期上升。 因此,此行为的两个可能原因可能是: 我没有从CUDA API获得页面锁定的内存,而cudaSuccess是伪造的 CUDA绕开了页面锁定内存的OS计数器,因为CUDA对Linux内核做了一些

  • 我从这个链接(Mifare Ultralight C Lock)获得了参考,使Mifare Ultralight标签上的所有页面都是只读的。 我可以在Android上成功地在Mi的Ultralight标签上写入消息。现在我想锁定第4到7页(或任何特定页面)。上面的链接只显示了如何锁定所有页面。我如何锁定特定页面? 此代码锁定所有页面: