當(dāng)事務(wù)Transactional遇見異步線程出現(xiàn)的坑及解決
問題
開發(fā)小伙伴遇到線上環(huán)境消息推送不成功,排查日志發(fā)現(xiàn)推送是id為null
代碼示例
@Transactional(rollbackFor = Exception.class) public void register(UserDTO dto) { User user = BeanCopyUtils.copyBean(dto, User.class); insert(user); //注冊成功消息推送 executor.execute(() -> pushRegisterMessage(user)); }
通過代碼分析,按照程序代碼執(zhí)行,插入用戶能產(chǎn)生數(shù)據(jù),但推送id為空,就是事務(wù)執(zhí)行完成是,多線程已經(jīng)執(zhí)行。
解決方案
1.多線程延時(shí)執(zhí)行,等事務(wù)執(zhí)行完成。
2.去掉事務(wù)
拓展
@Transactional注解屬性就是來控制事務(wù)屬性的。通過這些屬性來生成事務(wù)。
@Transactional注解在外部調(diào)用的函數(shù)上才有效果,內(nèi)部調(diào)用的函數(shù)添加無效。這是由AOP的特性決定的。
如果你在protected、private 或者默認(rèn)可見性的方法上使用 @Transactional 注解,這將被忽略,也不會(huì)拋出任何異常。
默認(rèn)情況下,只有來自外部的方法調(diào)用才會(huì)被AOP代理捕獲,也就是,類內(nèi)部方法調(diào)用本類內(nèi)部的其他方法并不會(huì)引起事務(wù)行為,即使被調(diào)用方法使用
@Transactional的函數(shù)調(diào)用有@Transactional的函數(shù)的時(shí)候,進(jìn)入第二個(gè)函數(shù)的時(shí)候是新的事務(wù),還是沿用之前的事務(wù)。
稍不注意就會(huì)拋UnexpectedRollbackException異常。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Servlet關(guān)于RequestDispatcher的原理詳解
這篇文章主要介紹了Servlet關(guān)于RequestDispatcher的原理詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05javafx 如何將項(xiàng)目打包為 Windows 的可執(zhí)行文件exe
文章介紹了三種將JavaFX項(xiàng)目打包為.exe文件的方法:方法1使用jpackage(適用于JDK14及以上版本),方法2使用Launch4j(適用于所有JDK版本),方法3使用InnoSetup(用于創(chuàng)建安裝包),每種方法都有其特點(diǎn)和適用范圍,可以根據(jù)項(xiàng)目需求選擇合適的方法,感興趣的朋友一起看看吧2025-01-01java的Builder原理和實(shí)現(xiàn)詳解
大家好,本篇文章主要講的是java的Builder原理和實(shí)現(xiàn)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問題解決
這篇文章主要介紹了Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05springboot使用Mybatis-plus分頁插件的案例詳解
這篇文章主要介紹了springboot使用Mybatis-plus分頁插件的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05java中Pulsar?InterruptedException?異常
這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java中Prime算法的原理與實(shí)現(xiàn)詳解
Prime算法是一種窮舉查找算法來從一個(gè)連通圖中構(gòu)造一棵最小生成樹。本文主要為大家介紹了Java中Prime算法的原理與實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-07-07