PG咨询锁应用
学习PostgreSQL咨询锁的原理、使用场景和实现方法 · 难度:入门 · +15XP
咨询锁简介
咨询锁是应用程序定义的轻量级锁,不依赖于表行,适用于协调多个会话间的并发访问。
获取与释放锁
-- 获取会话级咨询锁(阻塞)
SELECT pg_advisory_lock(12345);
-- 尝试获取锁(非阻塞)
SELECT pg_try_advisory_lock(12345); -- 返回true/false
-- 释放锁
SELECT pg_advisory_unlock(12345);
使用双参数锁(基于OID和ID)
-- 对表OID和行ID加锁
SELECT pg_advisory_lock(
(SELECT oid FROM pg_class WHERE relname = 'orders'),
42
);
-- 释放
SELECT pg_advisory_unlock(
(SELECT oid FROM pg_class WHERE relname = 'orders'),
42
);
应用场景
| 场景 | 说明 |
|---|---|
| 分布式作业调度 | 确保同一任务只在一个节点执行 |
| 缓存更新 | 防止缓存雪崩 |
| 资源限制 | 控制并发访问外部API |
-- 示例:作业调度
SELECT pg_try_advisory_lock(99999) AS locked;
-- 如果locked为true,执行任务结束后释放锁练习提示:编写一个函数,使用咨询锁实现一个简单的互斥计数器,每次调用加1。