Closed nifengfeiyang closed 3 years ago
一个实例获得下一个号段未更新到数据库中时另一个实例再去获取会导致id重复
获取和更新在一个事务里,我理解隔离级别做好应该没问题
如果A、B两个线程同时执行到获取,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。可以修改源码加个version字段用乐观锁判断下
如果A、B两个线程同时执行到获取,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。可以修改源码加个version字段用乐观锁判断下
如果
如果A、B两个线程同时执行到获取,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。可以修改源码加个version字段用乐观锁判断下
把事务的隔离级别设置为SERIALIZABLE就ok了,乐观锁方式如果version边界不匹配,还需要额外兜底处理
这个最简单的方法 也可以参照snowflake 为每一个服务设置一个datacenterId和workerId
update不是有行锁么,为啥会重复
@Novery 请问隔离级别是否可以通过修改源码设置,同时对于生成ID的效率是否有影响
不会重复,MYSQL原子更新 + 行锁
@jiangyixin1209 @Novery 说的我觉得有道理,谢谢大家的意见
segment模式下如果分布式部署,id会不会可能重复?