本文探讨了在项目优化锁粒度时,将乐观锁改造为分布式锁以解决单行数据并发更新问题的思路。当前系统使用乐观锁(version控制)处理大量并发场景,但存在更新时间范围被并发覆盖的风险。目标是实现类似数据库间隙锁的[user_id + [start_time, end_time]]粒度锁定,即在特定时间范围内锁定某个用户的作业数据,以避免数据竞争。文章寻求实现此功能的具体方法和建议。
当前系统采用乐观锁(version控制)来管理并发更新,但在高并发场景下,更新时间范围的左右区间存在被并发覆盖的风险,影响数据准确性。
项目目标是将锁粒度优化为分布式锁,以实现更精细的并发控制,具体期望的粒度是[user_id + [start_time, end_time]],即锁定特定用户在特定时间段内的作业数据。
这种锁机制类似于数据库的间隙锁,旨在防止在同一用户、同一时间范围内发生并发的覆盖性更新,从而保证数据的一致性和完整性。
文章作者正在寻求实现这种分布式锁机制的具体思路和技术方案,以解决现有乐观锁带来的并发问题。
最近项目中需要对锁的粒度进行优化,使用分布式锁的场景是:一个员工每天会进行作业,每次作业都会上报一条作业数据,其中有个 biz_time 字段表示作业实际发生的时间(系统会合并统计它多个作业任务的开始时间和结束时间,即最后数据表中会记录这个人当天的第一个任务的开始时间为 start_time ,最后一个任务的结束时间为 end_time ),但是上报作业数据是会发生乱序的,每次更新时间范围的左右区间不能发生并发覆盖更新。当然系统需求会更加复杂,例如他的不同作业类型切换,需要终止当天的作业时长统计,并开启一段新作业的统计等等,先不用考虑。
现在是用乐观锁通过 version 控制的,由于并发量比较大,希望改造成分布式锁来实现单行数据的并发数据竞争。预期能实现成[user_id + [start_time, end_time]]粒度,也就是某个人的作业时间在某个时间范围被锁住(类似数据库的间隙锁,锁定一个范围)。但是没有思路怎么实现,在此请教一下各位大佬!