来讨论一下用数据库实现简单分布式锁的问题

查看 40|回复 1
作者:zou8944   
来讨论一下用数据库实现简单分布式锁的问题
单纯做技术讨论,使用 PG 数据库实现一个分布式锁。仅考虑锁的正确性,不考虑可重入等功能。我的想法如下。

create table distribute_locks
(
    id         varchar     not null primary key,
    expire_at  timestamptz not null,
    created_at timestamptz not null default current_timestamp,
    updated_at timestamptz not null default current_timestamp
);
  • id 作为加锁的 key
  • expire_at 作为锁的过期时间。锁不存在或过期都算锁已被释放,此时其它方可以获取到该锁

    用法
  • 加锁

    insert into distribute_locks (id, expire_at)
    values (:id, now() + interval '1 minute')
    on conflict (id)
    do update set expire_at = now() + interval '1 minute'
    where distribute_locks.expire_at
    有内容返回时获取锁成功,否则获取锁失败
  • 锁续期

    update distribute_locks
    set expire_at = now() + interval '1 minute'
    where id = :id and expire_at > current_timestamp
    只有锁存在且过期才能续期,否则续期无效
  • 释放锁

    delete from distribute_locks
    where id = :id
    疑问点
    这样设计的锁能满足基本需求了,但还有一个问题没有解决,即如何稳定续期。
    问题点在于,如果我在获取到锁时启动一个线程去续期,那如果当前线程结束,没有主动释放锁。该续期线程要如何结束呢?
    我用的是 python 来做

    expire_at, 续期, null, SQL

  • opengps   
    我没看明白,这个 distribute_locks 表存在哪,因为我始终都想知道怎么实现的分布式锁。
    因为我关注点是:这到底是多个数据库的锁,还是分布式应用的共享一个库里的行数据作为锁
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部