业务场景:

我们经常会有些方法会调用一些方法异步执行,比如入库操作后要异步发送mq消息,发送短信或者发布事件等等
但是往往我们的业务方法总是包含事务的,要么全部成功,要么全部失败。
有的时候事务执行失败了或者还没有提交,异步方法就执行完成了

我们希望:

  1. 当我们事务失败回滚时,我们的异步操作也不执行
  2. 我们的异步操作需要等待事务完成后才执行

比如:

@Transactional(rollbackFor = Exception.class)
public boolean testTransactional() {Warehouse warehouse = warehouseService.getById(1);warehouse.setUpdateTime(null);warehouseService.updateById(warehouse);sendMsg();warehouseService.save(warehouse);return Boolean.TRUE;
}public void sendMsg(){ThreadUtils.execute(new Runnable() {@Overridepublic void run() {log.info("发送消息到mq");}});
}

这里我们编辑一个仓库, 然后再新增一个数据一样的仓库。 仓库表中code字段是有唯一索引的,所以新增肯定会失败,事务会回滚


这里,我们发现事务提交失败回滚了,但是mq消息还是发送成功了,不满足我们的预期

解决方案:

/*** 事务测试** @return*/
@Transactional(rollbackFor = Exception.class)
public boolean testTransactional1() {Warehouse warehouse = warehouseService.getById(1);warehouse.setUpdateTime(LocalDateTime.now());warehouseService.updateById(warehouse);TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {sendMsg();}});warehouseService.save(warehouse);return Boolean.TRUE;
}

使用TransactionSynchronizationManager, 重写afterCommit方法,把需要事务提交之后再执行的代码放到afterCommit中去,然后执行

发现并没有执行发送mq的方法。成功了

最后我们再去掉唯一索引试一下

发现发送mq永远都是在事务提交之后执行的,问题解决

我们看TransactionSynchronization 里还有 afterCompletion() 方法,这个是不管事务成功还是失败,当事务完成后就会执行。

如何在spring事务提交成功后再进行异步操作相关推荐

  1. spring 事务提交成功后,再去发送事件

    TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronizationAdapter() { ...

  2. Spring中事务提交成功后处理的异步调用方法

    为什么80%的码农都做不了架构师?>>>    问题 想要在Spring中提交事务成功后,调用一部分异步方法. 解决 TransactionSynchronizationManage ...

  3. Spring 事务提交回滚源码解析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring ...

  4. 帆软填报增加记录提交成功后没有_大病医疗填报图解

    判断是否符合扣除条件 在一个纳税年度内,纳税人发生的与基本医保相关的医药费用支出,扣除医保报销后个人负担(指医保目录范围内的自付部分)累计超过15000元的部分,由纳税人在办理年度汇算清缴时,在800 ...

  5. dedecms自定义表单提交成功后提示信息修改和跳转链接修改

    我们在用dedecms自定义表单提交成功后提示信息一般是"Dedecms 提示信息",这个要怎么改成自己想要的文字呢?还有就是提示页停留时间,目前估计就2秒,太快了,要如何设置长点 ...

  6. 页面提交成功后,弹窗提示

    因为要求提交成功后返回弹窗,本来用的是@ResponseBody ,直接输出的成功 但是不好看嘛,所以用下图这样的 我自己想了个方法,不知道有没有更好的. 写了个div隐藏,页面加载默认传一个mode ...

  7. js提交成功后,清空表单

    js提交成功后,清空表单: $("form")[0].reset(); //清空表单 转载于:https://www.cnblogs.com/bagnliu/p/8205536.h ...

  8. vue的form表单在提交成功后置空

    vue的form表单在提交成功后置空 form表单 说明 :form表单加上属性值 ref="form" 点击事件加入 roleManager.$refs['form'].rese ...

  9. java spring 事务提交_Spring 事务提交之后再执行操作

    Spring代码实现: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ster ...

最新文章

  1. 2018-2019-2 20165315《网络攻防技术》Exp6 信息搜集与漏洞扫描
  2. 从父页面在iframe中调用JavaScript代码
  3. Python学会了,然后呢?
  4. VMware如何进入安全模式
  5. adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...
  6. 深度学习笔记(32) 目标定位
  7. 利用Arena Allocation避免HBase触发Full GC
  8. [***]HZOI20190714 T2熟练剖分
  9. P2296 寻找道路
  10. ngin IP跳域名 域名跳域名 if多判断
  11. linux ssh-copy-id命令本地主机的公钥复制到远程主机的authorized_keys文件上
  12. linux文件名格式,ASM文件名格式
  13. Android基础Activity篇——创建一个活动(Activity)
  14. 计算机前景和需求,计算机类专业薪资排行:这6个收入更高,发展前景和就业需求很大...
  15. html5图片漂浮代码,QQ空间免费漂浮代码怎么搞啊
  16. Constructing Narrative Event Evolutionary Graph for Script Event Prediction
  17. M域、B域、O域分别指什么?
  18. 作为元宇宙的雏形:GameFi领域年末正在不断成长
  19. 如何创建一个微信公众号(手把手、超详细)
  20. java语言和C语言的区别

热门文章

  1. HTTP错误403.9-禁止访问:连接的用户过多 相关
  2. 软考高级 真题 2012年上半年 信息系统项目管理师 案例分析
  3. uboot.lds 链接文件分析
  4. 【转载】没有安装Google App,如何与gmial账户同步联系人
  5. 解决win10搜索框无法搜索本地应用或无反应
  6. Minecraft 1.16 简易高效的自动钓鱼脚本
  7. IntellJ IDEA 基础之 常用快捷键的简单整理
  8. Node.js stream模块(三)背压机制
  9. APP自动化--元素操作之九宫格解锁密码图案
  10. 第十五期】Monica:单身滴美女程序员 多图!