集成shardingsphere时,由于对表做了分表,所以主键id设置为非自增的主键。当在java代码中执行insert逻辑时,原计划是shardingsphere设置的雪花算法生成的id代替了mysql的自增主键。没有集成seata时是没问题的,但是集成seata后,进入seata代码逻辑时,会先获取主键是哪个字段,然后再判断主键是否自增,如果不是自增的那就会抛一个ShouldNeverHappenException。
以下为seata代码的逻辑
代码执行的类:
io.seata.rm.datasource.exec.mysql.MySQLInsertExecutor
containsPK源码:
解决办法:在mapper.xml文件中直接写sql,且需要带上主键字段,然后在执行插入sql之前,在java代码中需要手动生成一个id,set到主键id字段。如上图1,这个时候,containsPK返回的是true,然后会执行下图中代码:
getPkValuesByColumn()方法中会识别到主键字段,并且拿到主键值,按照正确业务逻辑往下执行。



