Meituan-Dianping / Leaf

Distributed ID Generate Service
Apache License 2.0
6.46k stars 1.84k forks source link

segment模式下如果分布式部署,id会不会可能重复? #151

Closed nifengfeiyang closed 3 years ago

nifengfeiyang commented 4 years ago

segment模式下如果分布式部署,id会不会可能重复?

lucky8875 commented 4 years ago

一个实例获得下一个号段未更新到数据库中时另一个实例再去获取会导致id重复

Novery commented 3 years ago

获取和更新在一个事务里,我理解隔离级别做好应该没问题

lucky8875 commented 3 years ago

如果A、B两个线程同时执行到获取,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。可以修改源码加个version字段用乐观锁判断下

Novery commented 3 years ago

如果A、B两个线程同时执行到获取,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。可以修改源码加个version字段用乐观锁判断下

如果

如果A、B两个线程同时执行到获取,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。可以修改源码加个version字段用乐观锁判断下

把事务的隔离级别设置为SERIALIZABLE就ok了,乐观锁方式如果version边界不匹配,还需要额外兜底处理

lichenhuinn commented 3 years ago

这个最简单的方法 也可以参照snowflake 为每一个服务设置一个datacenterId和workerId

66951735 commented 3 years ago

update不是有行锁么,为啥会重复

silloy commented 3 years ago

@Novery 请问隔离级别是否可以通过修改源码设置,同时对于生成ID的效率是否有影响

q474818917 commented 3 years ago

不会重复,MYSQL原子更新 + 行锁

nifengfeiyang commented 3 years ago

@jiangyixin1209 @Novery 说的我觉得有道理,谢谢大家的意见