当事务Transactional遇见异步线程出现的坑及解决

 更新时间:2023年12月02日 08:40:58   作者:三省同学  
这篇文章主要介绍了当事务Transactional遇见异步线程出现的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题

开发小伙伴遇到线上环境消息推送不成功,排查日志发现推送是id为null

代码示例

@Transactional(rollbackFor = Exception.class)
public void register(UserDTO dto) {
    User user = BeanCopyUtils.copyBean(dto, User.class);
    insert(user);
    //注册成功消息推送
    executor.execute(() -> pushRegisterMessage(user));
}

通过代码分析,按照程序代码执行,插入用户能产生数据,但推送id为空,就是事务执行完成是,多线程已经执行。

解决方案

1.多线程延时执行,等事务执行完成。

2.去掉事务

拓展

@Transactional注解属性就是来控制事务属性的。通过这些属性来生成事务。

@Transactional注解在外部调用的函数上才有效果,内部调用的函数添加无效。这是由AOP的特性决定的。

如果你在protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用

@Transactional的函数调用有@Transactional的函数的时候,进入第二个函数的时候是新的事务,还是沿用之前的事务。

稍不注意就会抛UnexpectedRollbackException异常。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Servlet关于RequestDispatcher的原理详解

    Servlet关于RequestDispatcher的原理详解

    这篇文章主要介绍了Servlet关于RequestDispatcher的原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Python如何使用@property @x.setter及@x.deleter

    Python如何使用@property @x.setter及@x.deleter

    这篇文章主要介绍了Python如何使用@property @x.setter及@x.deleter,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • javafx 如何将项目打包为 Windows 的可执行文件exe

    javafx 如何将项目打包为 Windows 的可执行文件exe

    文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用Launch4j(适用于所有JDK版本),方法3使用InnoSetup(用于创建安装包),每种方法都有其特点和适用范围,可以根据项目需求选择合适的方法,感兴趣的朋友一起看看吧
    2025-01-01
  • java的Builder原理和实现详解

    java的Builder原理和实现详解

    大家好,本篇文章主要讲的是java的Builder原理和实现详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 详解java如何集成swagger组件

    详解java如何集成swagger组件

    今天给大家带来的是关于Java的相关知识,文章围绕着java如何集成swagger组件展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring多定时任务@Scheduled执行阻塞问题解决

    Spring多定时任务@Scheduled执行阻塞问题解决

    这篇文章主要介绍了Spring多定时任务@Scheduled执行阻塞问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • springboot使用Mybatis-plus分页插件的案例详解

    springboot使用Mybatis-plus分页插件的案例详解

    这篇文章主要介绍了springboot使用Mybatis-plus分页插件的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 我赌你不清楚Spring中关于Null的这些事

    我赌你不清楚Spring中关于Null的这些事

    这篇文章主要介绍了我赌你不清楚Spring中关于Null的这些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • java中Pulsar InterruptedException 异常

    java中Pulsar InterruptedException 异常

    这篇文章主要为大家介绍了java中Pulsar InterruptedException 异常分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java中Prime算法的原理与实现详解

    Java中Prime算法的原理与实现详解

    Prime算法是一种穷举查找算法来从一个连通图中构造一棵最小生成树。本文主要为大家介绍了Java中Prime算法的原理与实现,感兴趣的可以学习一下
    2022-07-07

最新评论