首页   快速返回

基于数据库的分布式锁设计     所属分类 architecture
lock表 设计

lock_id	    varchar(128)	PK	 
create_time	timestamp	    notNull	创建时间
update_time	timestamp	    notNull	最后更新时间 持有者 定时心跳 更新该字段为数据库当前时间

version	    long	 	            乐观锁 版本号 避免并发更新问题
node_id	    varchar(128)	notNull	持有节点id 应用启动后 生成 ip + 随机字符串

now_time	timestamp	 	该字段不存储,查询时 直接取数据库当前时间

统一使用 数据库时间,避免 集群各节点 时间不一致


锁记录不存在时 , Insert成功的节点 成功获取锁


锁记录存在 , 且锁超时 , 开始争抢锁 
使用乐观锁 update ,  更新成功的节点 成功获取锁

update  lock_table set node_id=? , update_time = now() ,version=version+1  where  version=?

可以把 锁超时判断放在数据库里做,这样更安全


持有锁的节点定时发送心跳 ,更新 update_time

更新时带上 node_id 和 version 条件
update  lock_table set update_time = now() ,version=version+1  where node_id=? and version=?

建议心跳时间 小于 锁超时时间 ,譬如心跳 5秒  锁超时 15秒或30秒

上一篇     下一篇
prometheus配置

linux下找出占用指定端口的进程

jvm设置滚动记录GC日志

prometheus集成grafana实现可视化

g1 GC 要点

四种引用及WeakHashMap介绍