前置知识: PostgreSQL

锁机制

3 minAdvanced2026/6/14

PostgreSQL锁机制:表级锁、行级锁、advisory锁的语法、兼容性与死锁处理

1. 表级锁

1.1 锁模式

锁模式SQL 语句冲突范围
ACCESS SHARESELECTACCESS EXCLUSIVE
ROW SHARESELECT FOR UPDATE/SHAREEXCLUSIVE, ACCESS EXCLUSIVE
ROW EXCLUSIVEUPDATE, DELETE, INSERTSHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
SHARE UPDATE EXCLUSIVEVACUUM, ALTER INDEXSHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
SHARECREATE INDEXROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
SHARE ROW EXCLUSIVEROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
EXCLUSIVEROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
ACCESS EXCLUSIVEALTER TABLE, DROP TABLE所有模式
-- 手动获取表锁
LOCK TABLE employees IN ACCESS EXCLUSIVE MODE;

2. 行级锁

2.1 行锁

语法说明
FOR UPDATESELECT … FOR UPDATE排他行锁
FOR NO KEY UPDATESELECT … FOR NO KEY UPDATE弱排他锁
FOR SHARESELECT … FOR SHARE共享行锁
FOR KEY SHARESELECT … FOR KEY SHARE弱共享锁

2.2 行锁兼容性

KEY SHARESHARENO KEY UPDATEUPDATE
KEY SHARE
SHARE
NO KEY UPDATE
UPDATE
-- 行锁示例
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

3. Advisory 锁

-- 获取 advisory 锁
SELECT pg_advisory_lock(12345);          -- 阻塞式
SELECT pg_try_advisory_lock(12345);      -- 非阻塞式

-- 释放
SELECT pg_advisory_unlock(12345);

-- 会话级锁(连接断开自动释放)
SELECT pg_advisory_lock(1, 2);  -- 双int参数

-- 事务级锁(事务结束自动释放)
SELECT pg_advisory_xact_lock(12345);

4. 查看锁

SELECT locktype, relation::regclass, mode, pid, granted
FROM pg_locks
WHERE pid != pg_backend_pid();

-- 查看阻塞
SELECT blocked.pid, blocker.pid, blocked.query, blocker.query
FROM pg_locks blocked
JOIN pg_locks blocker ON blocked.locktype = blocker.locktype
    AND blocked.database IS NOT DISTINCT FROM blocker.database
    AND blocked.relation IS NOT DISTINCT FROM blocker.relation
    AND NOT blocked.granted AND blocker.granted
    AND blocked.pid != blocker.pid;