問題描述
有段aop事務包裹的代碼恋拍,每次執(zhí)行完都會報“Transaction rolled back because it has been marked as rollback-only” 異常芥炭。
錯誤原因
上述錯誤的原因主要在于,一個父事務中包含了多個子事務氛濒,父事務和子事務合并成了同一個事務部服,當其中有子事務代碼拋異常并且異常被捕獲稳摄,并沒有繼續(xù)拋給父事務的話,子事務commit后饲宿,狀態(tài)會被設置為rollback-only厦酬;當父事務沒有任何錯誤返回結果時,會檢查子事務的狀態(tài)瘫想,發(fā)現(xiàn)有回滾狀態(tài)仗阅,則父事務一起進行回滾。
難點
這個問題的難點在于異常被子事務吃掉了国夜,而且并沒有打日志出來减噪,這樣異常日志就只有上面那句話,不過知道原理后车吹,可以看代碼中所有子事務中是否用了try....catch捕獲了異常筹裕,并且沒有拋出來。
教訓
在事務中盡量不要各種try...catch窄驹;在明確知道錯誤的情況下才應該進行try...catch朝卒;并且需要把所有錯誤日志打印出來;還需要注意事務嵌套事務之間的傳播級別乐埠。