19 条回复  ·  138 次点击
ys1992 初学 2024-9-25 09:08:54
"不同机房的应用实例使用同一个 DB" 这不就是天然实现分布式锁的基础设施么,没必要纠结非要使用 redis ,把 redis 分布式锁 setnx 和 expire ,用数据库的方式实现一遍就可以了呀,
举个例子,来个 lock 表,lock_name 作为唯一索引,加一个 lock_status 状态,expire_time 过期时间,
获取锁的时候 update lock set lock_status = 1 where lock_name = xxx and (lock_status = 0 or expire_time<now())
释放锁的时候 update lock set lock_status = 0 where lock_name = xxx and lock_status = 1
vishun 小成 2024-9-25 09:17:43
直接最简单的,数据库悲观锁 for update ,隔离级别设置为 RC ,貌似 RR 会有间隙锁导致的死锁。
roidinev 初学 2024-9-25 09:18:26
扫表看起来也是弱一致性动作。也要考虑协调问题
billbur 小成 2024-9-25 09:18:50
我们的做法是第一个做好幂等,也就是任务可以被重复执行但不会出现错误,另一个是根据某个字段做分片,取余或者一致型哈希算法去做,一个机房只处理一部分数据
jorneyr 小成 2024-9-25 09:36:11
select for update 语句可以实现分布式锁。
yh7gdiaYW 小成 2024-9-25 10:22:58
@ys1992 MySQL 在高并发下更新同一条数据可能会出现死锁,不如 Redis 用的省事儿。不过我也只是看过些案例没自己用 mysql 这么加过锁,也不清楚别的数据库是否也有这类问题
pangdundun996 初学 2024-9-25 10:23:25
1 ) DB 实现分布式锁
2 )如果可访问多机房的话,引入调度节点
dododada 初学 2024-9-25 10:47:17
7 楼的方案没啥问题,你也没有数据同步什么的,顶天就是个缓存数据不一致
wangliran1121 初学 2024-9-25 11:22:03
select for update
8355 小成 2024-9-25 11:46:39
啊?这不是最传统的简单方案就可以解决的吗
mysql 抢占啊
增加一个状态字段 假设 active_status = 0 未启动
按照不同机房你最多有 2 个实例参与抢占
update table set active_status = 1 where id = xxx
看影响行数 = 1 视为抢占成功,开始执行就行了。。 其他的 return
为啥还需要分布式锁之类的,mysql update 一定是原子的啊
12
返回顶部