【问题标题】:Ungranted access exclusive lock blocks access share lock未授权访问独占锁块访问共享锁
【发布时间】:2020-12-16 18:36:41
【问题描述】:

从我们在 PostgreSQL 中进行的测试来看,对表的未授权访问排他锁似乎阻塞了访问共享锁。下面描述了我们执行的测试。

第 1 节:

begin;
select * from users where id = 1;

注意:交易是有意为测试开放的


第 2 节:

alter table users add column foo boolean;

注意: 此语句被 Session 1 中的语句阻塞。访问排他锁尚未授予。


第三节:

select * from users where id = 2;

会话 3 中的最后一条语句被阻止。

当来自alter语句的访问排他锁尚未被授予(因为它被会话1阻塞)时,它是如何阻塞的?我们有什么遗漏的吗?

【问题讨论】:

    标签: sql database postgresql locking


    【解决方案1】:

    The documentation 描述:

    如果一个服务器进程持有与被阻塞进程的锁请求(硬块)冲突的锁,或者正在等待与被阻塞进程的锁请求冲突并且在等待中领先于它的锁,则它会阻塞另一个服务器进程队列(软块)。

    因此,未授予的锁将排队,并且您不能在具有冲突锁请求的进程之前跳过队列。这样就不会永远阻塞任何进程(除非阻塞事务需要永远)。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多