首页 / ... / PostgreSQL / 锁机制
锁模式 SQL 语句 冲突范围 ACCESS SHARE SELECT ACCESS EXCLUSIVE ROW SHARE SELECT FOR UPDATE/SHARE EXCLUSIVE, ACCESS EXCLUSIVE ROW EXCLUSIVE UPDATE, DELETE, INSERT SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE SHARE UPDATE EXCLUSIVE VACUUM, ALTER INDEX SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE SHARE CREATE INDEX ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE SHARE ROW EXCLUSIVE — ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE EXCLUSIVE — ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE ACCESS EXCLUSIVE ALTER TABLE, DROP TABLE 所有模式
-- 手动获取表锁
LOCK TABLE employees IN ACCESS EXCLUSIVE MODE;
锁类 型 语法 说明 FOR UPDATE SELECT … FOR UPDATE 排他行锁 FOR NO KEY UPDATE SELECT … FOR NO KEY UPDATE 弱排他锁 FOR SHARE SELECT … FOR SHARE 共享行锁 FOR KEY SHARE SELECT … FOR KEY SHARE 弱共享锁
KEY SHARE SHARE NO KEY UPDATE UPDATE 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 ;
-- 获取 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 );
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 ; 上一篇 体系架构
下一篇 死锁检测与处理