当事务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异常。

总结

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

相关文章

  • Spring boot多线程配置方法

    Spring boot多线程配置方法

    这篇文章主要为大家详细介绍了Spring boot多线程配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 解决Spring Boot应用打包后文件访问问题

    解决Spring Boot应用打包后文件访问问题

    在Spring Boot项目的开发过程中,一个常见的挑战是如何有效地访问和操作资源文件,本文就来介绍一下解决Spring Boot应用打包后文件访问问题,感兴趣的可以了解一下
    2024-01-01
  • 创建SpringBoot工程并集成Mybatis的方法

    创建SpringBoot工程并集成Mybatis的方法

    这篇文章主要介绍了创建SpringBoot工程并集成Mybatis,需要的朋友可以参考下
    2018-06-06
  • JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch使用详解

    这篇文章主要为大家详细介绍了JAVA多线程CountDownLatch的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java管道流实现线程间通信过程解析

    Java管道流实现线程间通信过程解析

    这篇文章主要介绍了Java管道流实现线程间通信过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解Java中的八种单例创建方式

    详解Java中的八种单例创建方式

    单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。本文将详细介绍Java中单例的八种创建方式,需要的可以参考一下
    2022-02-02
  • Java设计模式之观察者模式observer pattern详解

    Java设计模式之观察者模式observer pattern详解

    这篇文章主要介绍了Java设计模式之观察者模式observer pattern详解,当一个对象发生数据变化时,通知其他相关的一系列对象,接受到通知的对象根据该对象的变化进行相应处理以响应变化的过程,需要的朋友可以参考下
    2023-12-12
  • Java线程中的常见方法(start方法和run方法)

    Java线程中的常见方法(start方法和run方法)

    这篇文章主要介绍了Java线程中的常见方法(start方法和run方法),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • Java拖曳鼠标实现画线功能的方法

    Java拖曳鼠标实现画线功能的方法

    这篇文章主要介绍了Java拖曳鼠标实现画线功能的方法,需要的朋友可以参考下
    2014-07-07
  • JavaIO字符操作和对象操作示例详解

    JavaIO字符操作和对象操作示例详解

    这篇文章主要为大家介绍了JavaIO字符操作和对象操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论