Spring宣告式事務失效的情況
阿新 • • 發佈:2020-08-12
今天電話面試,面試官問了此問題,但是自己卻答不上來,記錄下答案
使用預設的事務處理方式
spring的事務預設是對RuntimeException
進行回滾,而不繼承RuntimeException
的不回滾。因為在java的設計中,它認為不繼承RuntimeException
的異常是”checkException”或普通異常,如IOException
,這些異常在java語法中是要求強制處理的。對於這些普通異常,spring預設它們都已經處理,所以預設不回滾。可以新增rollbackfor=Exception.class來表示所有的Exception都回滾。
內部呼叫
不帶事務的方法呼叫該類中帶事務的方法,不會回滾。因為spring的回滾是用過代理模式生成的,如果是一個不帶事務的方法呼叫該類的帶事務的方法,直接通過this.xxx()
常見解決方法:
1.拆類。
2.因為事務使用aop實現的,Spring boot可以匯入aop-starter,主類開啟@EnableAspectJAutoProxy,然後在service中使用 AopContext.currentProxy(),拿到當前的代理類