1.Transaction rolled back because it has been marked as rollback-only
事務(wù)已回滾冠蒋,因?yàn)樗粯?biāo)記成了只回滾
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
query開頭的方法readOnly,所以只能select,拋出異常封拧,insert/update/delete操作必然回滾
2.發(fā)現(xiàn)selectA調(diào)用selectB,如果selectB拋出Exception,selectA中捕獲Exception但是并不繼續(xù)向外拋出,最后會(huì)出現(xiàn)錯(cuò)誤拾碌。
糾其原理其實(shí)很簡(jiǎn)單,在selectB返回的時(shí)候街望,transaction被設(shè)置為rollback-only了校翔,但是selectA正常消化掉,沒有繼續(xù)向外拋灾前。
那么selectA結(jié)束的時(shí)候防症,transaction會(huì)執(zhí)commit操作,但是 transaction已經(jīng)被設(shè)置為 rollback-only了豫柬。
所以會(huì)出現(xiàn)這個(gè)錯(cuò)誤告希。
有的同學(xué)說了,那不是沒得搞了烧给,service不能拋出異常,或者不能攔截異常了喝噪?
其實(shí)不然础嫡,其實(shí)錯(cuò)誤不在這里,而是select這種操作為什么要啟動(dòng)事務(wù)呢酝惧?