1、@Transactional 應(yīng)用在非public方法上
Java的訪問權(quán)限主要有四種 :private、default、protected浓瞪、public,它們的權(quán)限從左到右巧婶,依次變大乾颁。
2、方法用final修飾
如果一個方法不想被子類重寫粹舵,我們可以將該方法定義為final钮孵。我們知道@Transactional是通過AOP來實(shí)現(xiàn)的骂倘,如果方法被定義為了final眼滤,那么它就不能被代理類重寫,也就無法使用事務(wù)
3历涝、未被Spring管理
@Transactional是由Spring容器所管理诅需,如果一個使用@Transactional的Bean不是通過Spring容器創(chuàng)建的(直接new的),則@Transctional是無效的
4荧库、方法內(nèi)部調(diào)用
當(dāng)@Transactional注解的方法在同一個類的內(nèi)部被調(diào)用時堰塌,會導(dǎo)致后面調(diào)用方法的@Transactional失效。
這是因?yàn)镾pring的事務(wù)管理是基于AOP(面向切面編程)實(shí)現(xiàn)的分衫,而AOP代理默認(rèn)是通過JDK動態(tài)代理或CGLIB代理來實(shí)現(xiàn)的场刑。
原理分析
- JDK動態(tài)代理:
僅適用于接口上的方法。
如果你的Bean實(shí)現(xiàn)了某個接口蚪战,Spring會使用JDK動態(tài)代理來創(chuàng)建代理對象牵现。 - CGLIB代理:
適用于沒有實(shí)現(xiàn)接口的類。
Spring會生成一個子類來代理這個Bean邀桑。
解決方案
將事務(wù)性方法提取到另一個Bean中
5瞎疼、多線程調(diào)用
兩個方法不在一個線程中
6 數(shù)據(jù)庫不支持