1. 程式人生 > >Transaction rolled back because it has been marked as rollback-only解決方案

Transaction rolled back because it has been marked as rollback-only解決方案

預設spring事務只在發生未被捕獲的 runtimeexcetpion時才回滾。spring aop 異常捕獲原理:被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimeexception的異常,但可以通過配置來捕獲特定的異常並回滾,換句話說在service的方法中不使用try catch 或者在catch中最後加上throw new runtimeexcetpion(),這樣程式異常時才能被aop捕獲進而回滾。

解決方案:在catch中加入TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();手動回滾或者丟擲throw new runtimeexcetpion();異常。前者不需要在上層(controller層)做任何處理,後者需要在上層捕獲這個異常。