背景
因公司业务及预算调整,系统部署从原有云服务提供商迁移到另外一家云服务提供商,在测试新服务能力的时候,发现应用系统某个功能不能正常使用,仅仅是第一次成功。
为了分析问题,笔者使用以下环境还原报错场景进行讲解。
- Spring Boot: 3.0.2
- MySQL: 5.7.31
- MyBatis: 3.5.1
问题分析
通过查看服务日志,发现后端接口报SQL异常-主键冲突,如下图所示:
刚开始看到这个错误信息,直接就懵了,怎么在另外一个服务商那里跑得好好的,到这边就主键冲突了呢。一通百度、Google之后,突然之间有个想法,会不会是这两个云服务商提供的MySQL服务,某些参数有区别。
分析数据
因为数据是迁移过来的,表中有大量旧数据,不好确定到底是那个值冲突了。
分析代码
然后查看我们代码,找到对应的PO类代码,代码类似以下,主要关注主键属性 id 的数据类型。
public class UserPo {
private int id;
private String name;
private String email;
private String password;
}
代码中发现id属性是int类型的,我们知道,Java中int类型默认值为0,在新增数据的时候并没有为id属性设置值,代码类似下面这样:
UserPo user = new UserPo