业务场景:

我们经常会有些方法会调用一些方法异步执行,比如入库操作后要异步发送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. 基于Tkinter利用python实现颜色空间转换程序
  2. linux ubuntu QT 下载和安装(Qt Creator)
  3. java多线程中注入Spring对象问题
  4. 最高201万!华为高薪招应届生!专业是...
  5. python中的reduce函数用法
  6. php代码并发控制,php并发控制
  7. typescript接口使用
  8. [LOJ 6485]LJJ 学二项式定理
  9. Android CPU 深度睡眠,什么是CPU更深度睡眠
  10. 群英服务器网站,群英网
  11. 网络资源计算机教学设计,第11课 网络资源任我搜 教案
  12. Remove specific element by editing the array
  13. AN OPEN-SOURCE SPEAKER GENDER DETECTION FRAMEWORK FOR MONITORING GENDER EQUALITY
  14. 高项 案例分析重点知识-多读(一)
  15. bthread源码分析(七)bthread调度逻辑
  16. CECBC区块链专委会副主任吴桐受邀成为伏羲智库兼职研究员
  17. 领导力须突破命令控制式管理
  18. 使用sale数据库,统计全部商品的平均价格,以及文具类商品的平均价格
  19. 论文格式排版Issue及解决办法
  20. Handsome主题添加Sticker-Heo表情包

热门文章

  1. 世纪性难题:剪不断、理还乱的开发测试关系
  2. APAD 7'“谷歌Android操作系统1.5无线触摸屏
  3. win7虚拟机上安装visual studio2017社区版的相关问题以及解决办法
  4. 前端工程师的摸鱼日常(11)
  5. unity之万代南梦宫高管:传统开发商如何做好手游
  6. 太空射击python
  7. 计算机文件打开方式这么还原,dat文件还原默认打开方式如何设置?还原默认打开方式的详细步骤...
  8. CF 183(div2)
  9. 小米打印机显示服务器出错,关于小米笔记本连接不上网络打印机的处理方法!莫名其妙····...
  10. 记录redis Connection timed out处理(关于THP的处理)