pglock
在 PostgreSQL 内实现轻量级分布式锁服务
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pglock | 1.0.0 | UTIL | PostgreSQL | SQL |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 4140 | pglock | 否 | 否 | 否 | 是 | 否 | 否 | pglock |
| 相关扩展 | pg_cron pgmb pgmq pgq pg_cron |
|---|
Packaging patches the upstream pgmb.control mismatch and installs the extension as pglock.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 1.0.0 | 1817161514 | pglock | pg_cron |
| RPM | PIGSTY | 1.0.0 | 1817161514 | pglock_$v | pg_cron_$v |
| DEB | PIGSTY | 1.0.0 | 1817161514 | postgresql-$v-pglock | postgresql-$v-cron |
构建
您可以使用 pig build 命令构建 pglock 扩展的 RPM / DEB 包:
pig build pkg pglock # 构建 RPM / DEB 包
安装
您可以直接安装 pglock 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install pglock; # 当前活跃 PG 版本安装
pig ext install -y pglock -v 18 # PG 18
pig ext install -y pglock -v 17 # PG 17
pig ext install -y pglock -v 16 # PG 16
pig ext install -y pglock -v 15 # PG 15
pig ext install -y pglock -v 14 # PG 14
dnf install -y pglock_18 # PG 18
dnf install -y pglock_17 # PG 17
dnf install -y pglock_16 # PG 16
dnf install -y pglock_15 # PG 15
dnf install -y pglock_14 # PG 14
apt install -y postgresql-18-pglock # PG 18
apt install -y postgresql-17-pglock # PG 17
apt install -y postgresql-16-pglock # PG 16
apt install -y postgresql-15-pglock # PG 15
apt install -y postgresql-14-pglock # PG 14
创建扩展:
CREATE EXTENSION pglock CASCADE; -- 依赖: pg_cron
用法
语法:
SELECT pglock.lock('b3d8a762-3a0e-495b-b6a1-dc8609839f7b', 'users'); SELECT pglock.unlock('b3d8a762-3a0e-495b-b6a1-dc8609839f7b', 'users'); SELECT pglock.ttl();来源:README
pglock 是一个在 PostgreSQL 内部实现的轻量级分布式锁服务。它把锁存储在表中,并支持基于 TTL 的过期清理。
基本函数
README 记录了四个核心函数:
pglock.lock(id, resource),用于获取锁pglock.unlock(id, resource),用于释放锁pglock.ttl(),用于清理过期锁pglock.set_serializable(),用于切换到可串行化隔离级别
获取锁:
SELECT pglock.lock('worker-1', 'users');
释放锁:
SELECT pglock.unlock('worker-1', 'users');
隔离级别
上游文档建议在并发场景下使用可串行化隔离级别以保证正确性:
SELECT pglock.set_serializable();
或者:
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT pglock.lock('my-id', 'my-resource');
SELECT pglock.unlock('my-id', 'my-resource');
COMMIT;
TTL 过期
锁带有可配置 TTL,默认值为 5 分钟。pglock.ttl() 会释放 updated_at 超过 TTL 的记录:
SELECT pglock.ttl();
如果安装了 pg_cron,README 说明可以每分钟运行一次 pglock.ttl()。
模式
锁表是 pglock.locks,字段包括:
idresourcelockedttlcreated_atupdated_at
主键是 (id, resource)。