當(dāng)事務(wù)Transactional遇見(jiàn)異步線(xiàn)程出現(xiàn)的坑及解決
問(wèn)題
開(kāi)發(fā)小伙伴遇到線(xiàn)上環(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);
//注冊(cè)成功消息推送
executor.execute(() -> pushRegisterMessage(user));
}通過(guò)代碼分析,按照程序代碼執(zhí)行,插入用戶(hù)能產(chǎn)生數(shù)據(jù),但推送id為空,就是事務(wù)執(zhí)行完成是,多線(xiàn)程已經(jīng)執(zhí)行。
解決方案
1.多線(xiàn)程延時(shí)執(zhí)行,等事務(wù)執(zhí)行完成。
2.去掉事務(wù)
拓展
@Transactional注解屬性就是來(lái)控制事務(wù)屬性的。通過(guò)這些屬性來(lái)生成事務(wù)。
@Transactional注解在外部調(diào)用的函數(shù)上才有效果,內(nèi)部調(diào)用的函數(shù)添加無(wú)效。這是由AOP的特性決定的。
如果你在protected、private 或者默認(rèn)可見(jiàn)性的方法上使用 @Transactional 注解,這將被忽略,也不會(huì)拋出任何異常。
默認(rèn)情況下,只有來(lái)自外部的方法調(diào)用才會(huì)被AOP代理捕獲,也就是,類(lèi)內(nèi)部方法調(diào)用本類(lèi)內(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的原理詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
javafx 如何將項(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-01
java的Builder原理和實(shí)現(xiàn)詳解
大家好,本篇文章主要講的是java的Builder原理和實(shí)現(xiàn)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2021-12-12
Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問(wèn)題解決
這篇文章主要介紹了Spring多定時(shí)任務(wù)@Scheduled執(zhí)行阻塞問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
springboot使用Mybatis-plus分頁(yè)插件的案例詳解
這篇文章主要介紹了springboot使用Mybatis-plus分頁(yè)插件的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
java中Pulsar?InterruptedException?異常
這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java中Prime算法的原理與實(shí)現(xiàn)詳解
Prime算法是一種窮舉查找算法來(lái)從一個(gè)連通圖中構(gòu)造一棵最小生成樹(shù)。本文主要為大家介紹了Java中Prime算法的原理與實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-07-07

