當事務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為空,就是事務執(zhí)行完成是,多線程已經(jīng)執(zhí)行。
解決方案
1.多線程延時執(zhí)行,等事務執(zhí)行完成。
2.去掉事務
拓展
@Transactional注解屬性就是來控制事務屬性的。通過這些屬性來生成事務。
@Transactional注解在外部調用的函數(shù)上才有效果,內部調用的函數(shù)添加無效。這是由AOP的特性決定的。
如果你在protected、private 或者默認可見性的方法上使用 @Transactional 注解,這將被忽略,也不會拋出任何異常。
默認情況下,只有來自外部的方法調用才會被AOP代理捕獲,也就是,類內部方法調用本類內部的其他方法并不會引起事務行為,即使被調用方法使用
@Transactional的函數(shù)調用有@Transactional的函數(shù)的時候,進入第二個函數(shù)的時候是新的事務,還是沿用之前的事務。
稍不注意就會拋UnexpectedRollbackException異常。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Servlet關于RequestDispatcher的原理詳解
這篇文章主要介紹了Servlet關于RequestDispatcher的原理詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05javafx 如何將項目打包為 Windows 的可執(zhí)行文件exe
文章介紹了三種將JavaFX項目打包為.exe文件的方法:方法1使用jpackage(適用于JDK14及以上版本),方法2使用Launch4j(適用于所有JDK版本),方法3使用InnoSetup(用于創(chuàng)建安裝包),每種方法都有其特點和適用范圍,可以根據(jù)項目需求選擇合適的方法,感興趣的朋友一起看看吧2025-01-01Spring多定時任務@Scheduled執(zhí)行阻塞問題解決
這篇文章主要介紹了Spring多定時任務@Scheduled執(zhí)行阻塞問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05springboot使用Mybatis-plus分頁插件的案例詳解
這篇文章主要介紹了springboot使用Mybatis-plus分頁插件的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05java中Pulsar?InterruptedException?異常
這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02