Spring聲明式事務失效的情況


今天電話面試,面試官問了此問題,但是自己卻答不上來,記錄下答案

使用默認的事務處理方式

spring的事務默認是對RuntimeException進行回滾,而不繼承RuntimeException的不回滾。因為在java的設計中,它認為不繼承RuntimeException的異常是”checkException”或普通異常,如IOException,這些異常在java語法中是要求強制處理的。對於這些普通異常,spring默認它們都已經處理,所以默認不回滾。可以添加rollbackfor=Exception.class來表示所有的Exception都回滾。

@Transactional(rollbackFor = {Exception.class})

內部調用

不帶事務的方法調用該類中帶事務的方法,不會回滾。因為spring的回滾是用過代理模式生成的,如果是一個不帶事務的方法調用該類的帶事務的方法,直接通過this.xxx()調用,而不生成代理事務,所以事務不起作用。

常見解決方法:

1.拆類。

2.因為事務使用aop實現的,Spring boot可以導入aop-starter,主類開啟@EnableAspectJAutoProxy,然后在service中使用 AopContext.currentProxy(),拿到當前的代理類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM