未授权的访问独占锁块访问共享锁
Ungranted access exclusive lock blocks access share lock
从我们在 PostgreSQL 中进行的测试来看,对 table 的未授权访问排他锁似乎正在阻止访问共享锁。下面描述了我们执行的测试。
第 1 节课:
begin;
select * from users where id = 1;
注意:交易有意保持开放状态以供测试
第 2 节:
alter table users add column foo boolean;
注意:
此语句被会话 1 中的语句阻塞。尚未授予访问排他锁。
第 3 节:
select * from users where id = 2;
会话 3 中的最后一条语句被阻止。
当 alter 语句的访问排他锁尚未被授予时(因为它被会话 1 阻止),它是如何被阻止的?有什么我们遗漏的吗?
One server process blocks another if it either holds a lock that conflicts with the blocked process's lock request (hard block), or is waiting for a lock that would conflict with the blocked process's lock request and is ahead of it in the wait queue (soft block).
因此,未授予的锁会排队,并且您不能在具有冲突锁请求的进程之前跳过队列。这样一来,任何进程都不会永远被阻塞(除非阻塞事务需要永远)。
从我们在 PostgreSQL 中进行的测试来看,对 table 的未授权访问排他锁似乎正在阻止访问共享锁。下面描述了我们执行的测试。
第 1 节课:
begin;
select * from users where id = 1;
注意:交易有意保持开放状态以供测试
第 2 节:
alter table users add column foo boolean;
注意: 此语句被会话 1 中的语句阻塞。尚未授予访问排他锁。
第 3 节:
select * from users where id = 2;
会话 3 中的最后一条语句被阻止。
当 alter 语句的访问排他锁尚未被授予时(因为它被会话 1 阻止),它是如何被阻止的?有什么我们遗漏的吗?
One server process blocks another if it either holds a lock that conflicts with the blocked process's lock request (hard block), or is waiting for a lock that would conflict with the blocked process's lock request and is ahead of it in the wait queue (soft block).
因此,未授予的锁会排队,并且您不能在具有冲突锁请求的进程之前跳过队列。这样一来,任何进程都不会永远被阻塞(除非阻塞事务需要永远)。