pglock

在 PostgreSQL 内实现轻量级分布式锁服务

概览

扩展包名版本分类许可证语言
pglock1.0.0UTILPostgreSQLSQL
ID扩展名BinLibLoadCreateTrustReloc模式
4140pglockpglock
相关扩展pg_cron pgmb pgmq pgq pg_cron

Packaging patches the upstream pgmb.control mismatch and installs the extension as pglock.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.0.01817161514pglockpg_cron
RPMPIGSTY1.0.01817161514pglock_$vpg_cron_$v
DEBPIGSTY1.0.01817161514postgresql-$v-pglockpostgresql-$v-cron
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u22.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u22.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u24.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u24.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0

构建

您可以使用 pig build 命令构建 pglock 扩展的 RPM / DEB 包:

pig build pkg pglock         # 构建 RPM / DEB 包

安装

您可以直接安装 pglock 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

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,字段包括:

  • id
  • resource
  • locked
  • ttl
  • created_at
  • updated_at

主键是 (id, resource)


最后修改 2026-04-10: extension update (13b4540)