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

歡迎訪問 生活随笔!

生活随笔

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

javascript

html调用接口_Spring 自调用事务失效,你是怎么解决的?

發(fā)布時間:2024/7/23 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html调用接口_Spring 自调用事务失效,你是怎么解决的? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

" 相信大家都遇到一種事務(wù)失效場景,那就是 Spring 自調(diào)用,就是在 Service 方法內(nèi),調(diào)用另一個加 @Transactional 注解的方法,發(fā)現(xiàn)事務(wù)失效,這時候你是怎么解決的呢? "

1

事情回顧

那是一個我忘了天氣咋樣的下午,突然蹦出一個小紅點,嗯~ 挺著急的小紅點。

原來是事務(wù)失效了!

莫慌!莫慌!

最后小伙伴選擇了抽走,是我的工具類不香了么?

當然故事的結(jié)果是完美的,問題解決了。

2

事務(wù)

在開發(fā)中涉及到同時操作多個表的時候,要保證兩個操作要么一起成功,要么一起失敗,這時候就需要用到事務(wù)。

現(xiàn)在一般使用的都是基于 @Transactional 注解的聲明式事務(wù)

而事務(wù)使用過程中有以下幾個注意事項:

  • 事務(wù)只能應用到 public 方法上才會有效;
  • 事務(wù)需要從外部調(diào)用,Spring 自調(diào)用會失效;
  • 建議事務(wù)注解 @Transactional 一般添加在實現(xiàn)類上。
  • 當然這幾句話不是說我的,人家官方文檔可是明確說明的!

    這里可是說明了應僅將 @Transactional 注解應用于具有公開可見性的方法。如果對受 protected, private o或 package-visible 修飾的方法使用,則不會引發(fā)任何錯誤,但是被注解的方法不會顯示已配置的事務(wù)設(shè)置。

    說白了,就是你用了,不會報錯,但是不生效!

    至于建議加在實現(xiàn)類上,這個只是建議,不過如果加在接口類或接口方法上時,只有配置基于接口的代理才會生效。所以這塊還是老老實實的加在實現(xiàn)類或?qū)崿F(xiàn)類方法上吧。

    因為代理模式只攔截通過代理傳入的外部方法調(diào)用,所以自調(diào)用事務(wù)是不生效的。

    官方的解釋還是比較簡單明了的,雖然我看不懂,但是不影響我截圖。

    那我還是再截一個吧……

    3

    實際使用

    但是在開發(fā)中,小伙伴們往往會遇到這種情況!

    本來自己寫的代碼就一坨坨的又臭又長,里面有各種驗簽、驗參、查詢、驗證等等,就想著來個事務(wù),讓事務(wù)包裹的范圍最小,僅僅在同時更新的時候加上事務(wù)吧!

    這么寫,咦~ IDEA 報錯了,好像不能 private 修飾,那我改成 public。

    很顯然事務(wù)是不生效的。

    把更新的代碼放到又臭又長的代碼里面,讓它變得更臭更長,然后用 @Transactional 注解一加。完美解決!

    請放過那坨代碼吧!來看看下面的辦法。

    解決方案 1

    那我改成外部調(diào)用不就行了么?


    再聲明一個 Service,把更新表的邏輯放過去。

    我一般就喜歡使用這個辦法。

    解決方案 2

    使用編程式事務(wù),前面說了,使用聲明式事務(wù)時,又這又那,我換一種總可以吧!

    你看,我還把方法改成 private 修飾了,事務(wù)也生效。完美解決!

    其實這個方法也很不錯哦!

    解決方案 3

    又想用注解,又想自調(diào)用怎么辦?

    不過... 麻煩一點還是可以的。

    咱們可以參考編程式事務(wù)的方式,不就是不讓自調(diào)用么,我調(diào)外部方法,然后外部方法再給我調(diào)回來不就可以了。

    @Componentpublic?class?TransactionalComponent?{????public?interface?Cell?{????????void?run()?throws?Exception;????}????@Transactional(propagation?=?Propagation.REQUIRED,?rollbackFor?=?Exception.class)????public?void?required(Cell?cell)?throws?Exception?{????????cell.run();????}}

    這樣的話不就可以通過 TransactionalComponent 調(diào)用了么,并且還可以使用 lambda 表達式。

    當然基于這個版本也可以做一個迭代,就是使用靜態(tài)方法調(diào)用,不用每次都用 @Autowired 注入一次。

    public?class?TransactionalUtils?{????????private?static?volatile?TransactionalComponent?transactionalComponent;????private?static?synchronized?TransactionalComponent?getTransactionalComponent()?{????????if?(transactionalComponent?==?null)?{????????????//?從容器中獲取?transactionalComponent????????????transactionalComponent?=?ApplicationContextUtils.getBean(TransactionalComponent.class);????????}????????return?transactionalComponent;????}????public?static?void?required(TransactionalComponent.Cell?cell)?throws?Exception?{????????getTransactionalComponent().required(cell);????}}

    這樣通過工具類 TransactionalUtils 便可以直接調(diào)用靜態(tài)方法的方式執(zhí)行事務(wù)操作。

    4

    總結(jié)

    結(jié)束語

    本文主要介紹為什么會遇到事務(wù)失效,以及事務(wù)失效的避免方式,同時提供了三種方式來解決自調(diào)用事務(wù)失效的問題。不足之處,歡迎指正。

    相關(guān)資料

    [1] Spring 文檔:

    https://docs.spring.io/spring-framework/docs/5.3.0/reference/html/data-access.html#transaction-declarative-annotations

    - -


    作者:劉志航,一個宅宅的北漂程序員。

    公眾號:liuzhihangs,記錄工作學習中的技術(shù)、開發(fā)及源碼筆記;時不時分享一些生活中的見聞感悟。歡迎大佬來指導!

    總結(jié)

    以上是生活随笔為你收集整理的html调用接口_Spring 自调用事务失效,你是怎么解决的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。