Skip to content

Lock conflict

begin;
select * from tb;
alter table tb add c int;
exec_simple_query
    PortalRun | PortalRunMulti | PortalRunUtility | ProcessUtility
        standard_ProcessUtility | ProcessUtilitySlow
            AlterTableLookupRelation | RangeVarGetRelidExtended
                LockRelationOid | LockAcquireExtended | WaitOnLock
                    ProcSleep
                        WaitLatch | WaitEventSetWait /* src/backend/storage/ipc/latch.c */
                            WaitEventSetWaitBlock
进程A(持锁)        进程B(请求锁)

LockAcquire
                     LockAcquire
                     → 冲突
                     → 加入 wait queue
                     → ProcSleep(睡眠)

LockRelease
→ ProcLockWakeup
→ SetLatch(B)

                     被唤醒
                     → 重新检查
                     → 获取锁成功
PROC A (持有锁) PROC B(请求锁)
LockAcquire
LockAcquire
-> 冲突
-> 加入 wait queue
-> ProcSleep
LockRelease
-> ProcLockWakeup
-> SetLatch(B)
被唤醒
-> 重新检查
-> 获取锁