PG咨询锁并发控制
学习使用PostgreSQL咨询锁实现应用层自定义并发控制 · 难度:入门 · +15XP
咨询锁概念
咨询锁(Advisory Lock)是PostgreSQL提供的应用层锁机制,不绑定到具体数据库对象,由应用程序自行约定锁含义。
会话级咨询锁
-- 获取独占锁
SELECT pg_advisory_lock(12345);
-- 检查锁是否可用(不阻塞)
SELECT pg_try_advisory_lock(12345);
-- 释放锁
SELECT pg_advisory_unlock(12345);
事务级咨询锁
-- 事务结束时自动释放
SELECT pg_advisory_xact_lock(12345);
-- 在事务中使用
BEGIN;
SELECT pg_advisory_xact_lock(1001);
-- 执行需要保护的操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT; -- 锁自动释放
应用场景
| 场景 | 说明 |
|---|---|
| 分布式任务调度 | 确保同一任务只在一个节点执行 |
| 缓存重建 | 防止多个进程同时重建缓存 |
| 资源访问限制 | 限制对特定资源的并发访问数 |
共享/独占锁
-- 共享锁(多个会话可同时获取)
SELECT pg_advisory_lock_shared(12345);
-- 独占锁
SELECT pg_advisory_lock(12345);
练习提示
创建模拟任务处理函数,使用咨询锁确保同一任务ID不会被并发执行。