pg

package
v0.3.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 5, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

Documentation

Overview

Package pg 基于 PostgreSQL Advisory Lock 实现 pkg/dlock 的 Locker 与 Elector。

Advisory Lock 是 PG 内置的轻量级锁:session-level 锁随连接断开自动释放,不需要 额外的 TTL/续期机制——进程崩溃 → TCP 连接断 → 锁即释放,failover 语义天然正确。

依赖:仅 database/sql(标准库),用户自行 import PG 驱动(lib/pq 或 pgx/stdlib)。 不引入任何第三方依赖,与 beauty 核心保持一致。

每次 Lock/TryLock/electOnce 使用一个 dedicated sql.Conn(因为 advisory lock 是 session-level,绑定到 PG backend process,不能跨连接使用),Unlock / 失去 leader 后归还连接。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type DLock

type DLock struct {
	// contains filtered or unexported fields
}

DLock 基于 PG Advisory Lock 实现 Locker + Elector。零值不可用,用 NewDLock 构造。

func NewDLock

func NewDLock(db *sql.DB, opts ...DLockOption) *DLock

NewDLock 用已有 *sql.DB 创建 DLock。db 由调用方管理生命周期。

func (*DLock) Lock

func (d *DLock) Lock(ctx context.Context, key string) (dlock.Lock, error)

Lock 实现 dlock.Locker:在 dedicated 连接上执行 pg_advisory_lock(阻塞直到获得 锁或 ctx 取消)。返回的 Lock 持有该连接——Unlock 释放锁并归还连接。

func (*DLock) Run

func (d *DLock) Run(ctx context.Context, key string, onElected func(leaderCtx context.Context)) error

Run 实现 dlock.Elector:轮询 pg_try_advisory_lock 参选,当选后以 dedicated 连接 维持 leader 身份(PG advisory lock 随连接存活),定期 Ping 检测连接健康。 连接断开或 Ping 失败时 leaderCtx 被 cancel;onElected 返回后若 outer ctx 仍存活 则重新参选。

func (*DLock) TryLock

func (d *DLock) TryLock(ctx context.Context, key string) (dlock.Lock, bool, error)

TryLock 实现 dlock.Locker:非阻塞尝试 pg_try_advisory_lock。 已被占用返回 (nil, false, nil)。

type DLockOption

type DLockOption func(*DLock)

DLockOption 配置 DLock。

func WithHeartbeat

func WithHeartbeat(d time.Duration) DLockOption

WithHeartbeat 设置 Elector 持有期间的连接健康检测间隔(默认 5s)。 Ping 失败时 leaderCtx 被 cancel(连接断开 = 锁已释放)。

func WithPrefix

func WithPrefix(prefix string) DLockOption

WithPrefix 设置 key 前缀(默认 "beauty/dlock/"),与其他应用/环境隔离哈希空间。

func WithRetryInterval

func WithRetryInterval(d time.Duration) DLockOption

WithRetryInterval 设置竞选轮询间隔(默认 2s)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL