91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

分析動態代理給Spring事務埋下的坑

發布時間:2020-07-08 06:59:02 來源:網絡 閱讀:46506 作者:zfz_linux_boy 欄目:軟件技術

前言

Spring的聲明式事務讓我們不在編寫獲得連接、關閉連接、開啟事務、提交事務、回滾事務等代碼,通過一個簡單的@Transactional注解,就讓我們輕松進行事務處理。我們知道Spring事務基于AOP,采用動態代理實現,雖然使用簡單,但是在實際場景中,我們也會遇到一些坑。而往往遇到坑之后,我們都會茫然,這是由于沒有對Spring事務的實現機制做一點了解導致的。因此本篇博客將從原理的角度分析下動態代理給Spring事務埋下的坑!

從動態代理到Spring事務

UserService:

分析動態代理給Spring事務埋下的坑

txMethod和txMethod2方法模擬事務方法(相當于@Transactional)

noTxMethod方法是普通方法

UserServiceImpl

分析動態代理給Spring事務埋下的坑

在Spring事務中,我們往往是在Service層進行事務控制。

我們在UserServiceImpl中想模擬的是:

一個有事務的方法,去調用另一個有事務的方法,會怎么樣?

一個沒有事務的方法,去調用一個有事務的方法,會怎么樣?

UserHandler

分析動態代理給Spring事務埋下的坑

這里為了簡便,通過方法名稱來判斷是否開啟事務。

顯然,txMethod方法、txMethod2方法都“應該”開啟事務。

UserTest

分析動態代理給Spring事務埋下的坑

下面,我們來說下運行結果:

proxyInstance.txMethod2()方法,會開啟事務,這沒有問題。

proxyInstance.txMethod()方法,雖然在事務方法txMethod()內部調用了txMethod2()事務方法,但是并沒有新開啟事務。

proxyInstance.noTxMethod()方法,雖然在沒有事務的方法noTxMethod()內部調用了有事務的txMethod2()方法,但是并沒有開啟事務。

下面讓我們來對應下Spring事務中的現象:

分析動態代理給Spring事務埋下的坑

上述的情況,說白了,就是在一個Service內部,事務方法之間的嵌套調用,普通方法和事務方法之間的嵌套調用,都不會開啟新的事務!

為什么會這樣呢?

其實通過上面的動態代理的代碼,你應該可以發現:

動態代理最終都是要調用原始對象的,而原始對象在去調用方法時,是不會再觸發代理了!

那么如何解決呢?

很簡單,我們完全可以在抽出一個XxxService,在其內部調用UserService.txMethod()和UserService.txMethod2()方法即可。總而言之,避免在一個Service內部進行事務方法的嵌套調用!(因為動態代理導致這種場景事務失效了。)

好像Spring事務如此簡單,但是背后卻有這些道道,你被坑過么?

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉善左旗| 冀州市| 郴州市| 广东省| 子长县| 陆川县| 西充县| 璧山县| 七台河市| 汾阳市| 合山市| 长海县| 洛宁县| 正定县| 汝城县| 东乌| 山东省| 天气| 洛隆县| 汉沽区| 金湖县| 临沭县| 内黄县| 张家界市| 叙永县| 金川县| 襄城县| 宁海县| 同江市| 军事| 迭部县| 松潘县| 古丈县| 朔州市| 灵台县| 新宁县| 唐海县| 屯昌县| 新安县| 惠水县| 苏州市|