前置知识: PostgreSQL

锁机制

00:00
3 min Advanced 2026/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 UPDATESELECTFOR UPDATE排他行锁
FOR NO KEY UPDATESELECTFOR NO KEY UPDATE排他
FOR SHARESELECTFOR SHARE共享
FOR KEY SHARESELECTFOR 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;

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式