當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
spring 动态代理_分析动态代理给 Spring 事务埋下的坑
生活随笔
收集整理的這篇文章主要介紹了
spring 动态代理_分析动态代理给 Spring 事务埋下的坑
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
Spring的聲明式事務(wù)讓我們不在編寫獲得連接、關(guān)閉連接、開啟事務(wù)、提交事務(wù)、回滾事務(wù)等代碼,通過一個簡單的@Transactional注解,就讓我們輕松進(jìn)行事務(wù)處理。我們知道Spring事務(wù)基于AOP,采用動態(tài)代理實現(xiàn),雖然使用簡單,但是在實際場景中,我們也會遇到一些坑。而往往遇到坑之后,我們都會茫然,這是由于沒有對Spring事務(wù)的實現(xiàn)機(jī)制做一點(diǎn)了解導(dǎo)致的。因此本篇博客將從原理的角度分析下動態(tài)代理給Spring事務(wù)埋下的坑!
從動態(tài)代理到Spring事務(wù)
UserService:
UserService接口
txMethod和txMethod2方法模擬事務(wù)方法(相當(dāng)于@Transactional) noTxMethod方法是普通方法UserServiceImpl:
UserServiceImpl
在Spring事務(wù)中,我們往往是在Service層進(jìn)行事務(wù)控制。 我們在UserServiceImpl中想模擬的是:一個有事務(wù)的方法,去調(diào)用另一個有事務(wù)的方法,會怎么樣?一個沒有事務(wù)的方法,去調(diào)用一個有事務(wù)的方法,會怎么樣?UserHandler:
UserHandler
這里為了簡便,通過方法名稱來判斷是否開啟事務(wù)。顯然,txMethod方法、txMethod2方法都“應(yīng)該”開啟事務(wù)。UserTest:
UserTest
下面,我們來說下運(yùn)行結(jié)果:proxyInstance.txMethod2()方法,會開啟事務(wù),這沒有問題。proxyInstance.txMethod()方法,雖然在事務(wù)方法txMethod()內(nèi)部調(diào)用了txMethod2()事務(wù)方法,但是并沒有新開啟事務(wù)。proxyInstance.noTxMethod()方法,雖然在沒有事務(wù)的方法noTxMethod()內(nèi)部調(diào)用了有事務(wù)的txMethod2()方法,但是并沒有開啟事務(wù)。下面讓我們來對應(yīng)下Spring事務(wù)中的現(xiàn)象:
Spring事務(wù)
上述的情況,說白了,就是在一個Service內(nèi)部,事務(wù)方法之間的嵌套調(diào)用,普通方法和事務(wù)方法之間的嵌套調(diào)用,都不會開啟新的事務(wù)! 為什么會這樣呢? 其實通過上面的動態(tài)代理的代碼,你應(yīng)該可以發(fā)現(xiàn):動態(tài)代理最終都是要調(diào)用原始對象的,而原始對象在去調(diào)用方法時,是不會再觸發(fā)代理了!那么如何解決呢?很簡單,我們完全可以在抽出一個XxxService,在其內(nèi)部調(diào)用UserService.txMethod()和UserService.txMethod2()方法即可。總而言之,避免在一個Service內(nèi)部進(jìn)行事務(wù)方法的嵌套調(diào)用!(因為動態(tài)代理導(dǎo)致這種場景事務(wù)失效了。)好像Spring事務(wù)如此簡單,但是背后卻有這些道道,你被坑過么?
總結(jié)
以上是生活随笔為你收集整理的spring 动态代理_分析动态代理给 Spring 事务埋下的坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python嵌入c代码_怎样把Pytho
- 下一篇: java wed登录面 代码_JavaW