日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring 动态代理_分析动态代理给 Spring 事务埋下的坑

發布時間:2023/11/30 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring 动态代理_分析动态代理给 Spring 事务埋下的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

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

從動態代理到Spring事務

UserService:

UserService接口

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

UserServiceImpl:

UserServiceImpl

在Spring事務中,我們往往是在Service層進行事務控制。 我們在UserServiceImpl中想模擬的是:一個有事務的方法,去調用另一個有事務的方法,會怎么樣?一個沒有事務的方法,去調用一個有事務的方法,會怎么樣?

UserHandler:

UserHandler

這里為了簡便,通過方法名稱來判斷是否開啟事務。顯然,txMethod方法、txMethod2方法都“應該”開啟事務。

UserTest:

UserTest

下面,我們來說下運行結果:proxyInstance.txMethod2()方法,會開啟事務,這沒有問題。proxyInstance.txMethod()方法,雖然在事務方法txMethod()內部調用了txMethod2()事務方法,但是并沒有新開啟事務。proxyInstance.noTxMethod()方法,雖然在沒有事務的方法noTxMethod()內部調用了有事務的txMethod2()方法,但是并沒有開啟事務。

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

Spring事務

上述的情況,說白了,就是在一個Service內部,事務方法之間的嵌套調用,普通方法和事務方法之間的嵌套調用,都不會開啟新的事務! 為什么會這樣呢? 其實通過上面的動態代理的代碼,你應該可以發現:動態代理最終都是要調用原始對象的,而原始對象在去調用方法時,是不會再觸發代理了!那么如何解決呢?很簡單,我們完全可以在抽出一個XxxService,在其內部調用UserService.txMethod()和UserService.txMethod2()方法即可。總而言之,避免在一個Service內部進行事務方法的嵌套調用!(因為動態代理導致這種場景事務失效了。)

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

總結

以上是生活随笔為你收集整理的spring 动态代理_分析动态代理给 Spring 事务埋下的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。