业务场景:

我们经常会有些方法会调用一些方法异步执行,比如入库操作后要异步发送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. 看!那全球最伟大的人工智能女性科学家们!
  2. golang struct 动态创建
  3. LINUX下邮件服务器
  4. Postman导入和导出接口
  5. 设置span的宽度,让span象button那样显示
  6. [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
  7. P4254-[JSOI2008]Blue Mary开公司【李超树】
  8. centos7-安装redis-教程190923-精准版
  9. 跟熊浩学沟通30讲读后感_怎样提高自己的沟通表达能力
  10. SAP License:元素 POS_BELZEILE2 窗口 MAIN 没被定义给格式 INVENT
  11. mssql数据库基本语句总结(2)
  12. r求矩阵某一列的标准偏差_如何在R中找到标准偏差?
  13. Sentence-BERT实战
  14. [WPF系列]-DataBinding(数据绑定) 自定义Binding
  15. 已知平面上两点坐标及半径,求过两点圆弧的圆心坐标
  16. 【LaTeX笔记1】最全命令+符号
  17. CCRC信息安全服务资质认证流程知识点汇总
  18. Python 入门打卡1
  19. SQL简明数据分析教程
  20. 拓扑图介绍及相关功能

热门文章

  1. Ubuntu 修改用户名
  2. 一个屌丝程序猿的人生(三十五)
  3. python作业:有一个学生成绩表,包括学号、姓名、高数、英语,计算机。 录入若干个学生学号、姓名、高数、英语,计算机5项数据。 将学生成绩表数据写入文件,文件名为“学生成绩表.txt
  4. SDCC 2016上海、深圳、成都、杭州回顾,北京站将带来什么?
  5. 牛客网输入输出练习c++ 个人版题解
  6. svn服务器web项目,liunx 搭建svn服务器并实现钩子自动更新到web项目
  7. thinksns java_ThinkSNS+ 更新播报
  8. 自由Android安全研究员陈愉鑫:移动App灰色产业案例分析与防范
  9. 笔记:GIT配置和命令
  10. SDUTOJ 3034 ——炸学校