@transactional
public void task() {
//步驟(1)插入操作
try {
save();
}catch (Exception e){
log();
}
//步驟(2)查詢操作
select();
}
上述代碼是我遇到的出現如題所示的拋錯場景。
前提:在同個事務中,
1,步驟(1)插入操作拋錯了,但由于某些需要,加了try catch,錯誤沒有往外拋;
2,這時執行了步驟(2)的查詢操作(這里的查詢跟步驟(1)save的實體無關);
3,查詢觸發了autoFlush,先前保存失敗的記錄會再次保存,導致拋如題所述異常。
只要排查出步驟(1)中拋錯的原因(字段長度超出了數據庫設置的長度、非空字段但是空了、唯一索引沖突了......一切皆有可能)并解決,也就解決了如題所示的異常。