mysql同一张表中数据一样的问题和解决
其实问题有两个,但第一个是由于粗心导致的,会简单提及下
问题一:PM新提了个需求,涉及到分表,线下想偷懒就建的单表,线下测试都没问题,但上线后发现如果代码走update流程,分表之间主键id(设置的自增)相同的,都给修改了,这还是自动生成mapper导致的,update的条件是where id = #{id}, 这是个小问题,把where条件改一下就行了
问题二:由于建表时,没有设置唯一索引,导致同一张表中有相同字段的两个数据,因为这个insert/update这个数据的触发是消费MQ消息,结果排查了半天,同一个时间点,发了两个相同的MQ消息,结果线程1消费数据1时,select消息没有结果,然后组装数据准备执行insert;线程2消费数据2时,select消息是在线程1insert前,也没查出来结果,又执行了insert;下面放两个我们自己的监控日志看一下就明白了
从上面两张图可以看出执行过程为: 线程2select结果为null–> 线程1select结果为null -->线程2insert–>线程1insert
由于表未设置唯一索引,所以就有了两个相同数据,最后修改insert语句加上ON DUPLICATE KEY UPDATE
并把表索引改为唯一索引,但由于线下环境没办法通过MQ复现这样的情况,只是简单测了下ON DUPLICATE KEY UPDATE是否会生效(测试生效),后续等上生产后再看看会不会出现这样的错误(有唯一索引存在肯定不会出现重复的数据,但看看会不会相关报错吧)
总结:无论是单表还是分表,如果表中相同的数据只允许同时存在一条,那么insert语句一定要写成ON DUPLICATE KEY UPDATE并设置唯一索引