@transactional
public void task() {
//步骤(1)插入操作
try {
save();
}catch (Exception e){
log();
}
//步骤(2)查询操作
select();
}
上述代码是我遇到的出现如题所示的抛错场景。
前提:在同个事务中,
1,步骤(1)插入操作抛错了,但由于某些需要,加了try catch,错误没有往外抛;
2,这时执行了步骤(2)的查询操作(这里的查询跟步骤(1)save的实体无关);
3,查询触发了autoFlush,先前保存失败的记录会再次保存,导致抛如题所述异常。
只要排查出步骤(1)中抛错的原因(字段长度超出了数据库设置的长度、非空字段但是空了、唯一索引冲突了......一切皆有可能)并解决,也就解决了如题所示的异常。