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