开发者

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

目录
  • 问题
  • 代码示例
  • 解决方案
  • 拓展
  • 总结

问题

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

代码示例

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

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

解决方案

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

2.去掉事务

拓展

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

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

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

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

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

稍不注意就会抛UnexpectedRohttp://www.devze.comllbackException异常。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜