如何在spring事务提交成功后再进行异步操作
业务场景:
我们经常会有些方法会调用一些方法异步执行,比如入库操作后要异步发送mq消息,发送短信或者发布事件等等
但是往往我们的业务方法总是包含事务的,要么全部成功,要么全部失败。
有的时候事务执行失败了或者还没有提交,异步方法就执行完成了
我们希望:
- 当我们事务失败回滚时,我们的异步操作也不执行
- 我们的异步操作需要等待事务完成后才执行
比如:
@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事务提交成功后再进行异步操作相关推荐
- spring 事务提交成功后,再去发送事件
TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronizationAdapter() { ...
- Spring中事务提交成功后处理的异步调用方法
为什么80%的码农都做不了架构师?>>> 问题 想要在Spring中提交事务成功后,调用一部分异步方法. 解决 TransactionSynchronizationManage ...
- Spring 事务提交回滚源码解析
2019独角兽企业重金招聘Python工程师标准>>> 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring ...
- 帆软填报增加记录提交成功后没有_大病医疗填报图解
判断是否符合扣除条件 在一个纳税年度内,纳税人发生的与基本医保相关的医药费用支出,扣除医保报销后个人负担(指医保目录范围内的自付部分)累计超过15000元的部分,由纳税人在办理年度汇算清缴时,在800 ...
- dedecms自定义表单提交成功后提示信息修改和跳转链接修改
我们在用dedecms自定义表单提交成功后提示信息一般是"Dedecms 提示信息",这个要怎么改成自己想要的文字呢?还有就是提示页停留时间,目前估计就2秒,太快了,要如何设置长点 ...
- 页面提交成功后,弹窗提示
因为要求提交成功后返回弹窗,本来用的是@ResponseBody ,直接输出的成功 但是不好看嘛,所以用下图这样的 我自己想了个方法,不知道有没有更好的. 写了个div隐藏,页面加载默认传一个mode ...
- js提交成功后,清空表单
js提交成功后,清空表单: $("form")[0].reset(); //清空表单 转载于:https://www.cnblogs.com/bagnliu/p/8205536.h ...
- vue的form表单在提交成功后置空
vue的form表单在提交成功后置空 form表单 说明 :form表单加上属性值 ref="form" 点击事件加入 roleManager.$refs['form'].rese ...
- java spring 事务提交_Spring 事务提交之后再执行操作
Spring代码实现: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ster ...
最新文章
- 看!那全球最伟大的人工智能女性科学家们!
- golang struct 动态创建
- LINUX下邮件服务器
- Postman导入和导出接口
- 设置span的宽度,让span象button那样显示
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
- P4254-[JSOI2008]Blue Mary开公司【李超树】
- centos7-安装redis-教程190923-精准版
- 跟熊浩学沟通30讲读后感_怎样提高自己的沟通表达能力
- SAP License:元素 POS_BELZEILE2 窗口 MAIN 没被定义给格式 INVENT
- mssql数据库基本语句总结(2)
- r求矩阵某一列的标准偏差_如何在R中找到标准偏差?
- Sentence-BERT实战
- [WPF系列]-DataBinding(数据绑定) 自定义Binding
- 已知平面上两点坐标及半径,求过两点圆弧的圆心坐标
- 【LaTeX笔记1】最全命令+符号
- CCRC信息安全服务资质认证流程知识点汇总
- Python 入门打卡1
- SQL简明数据分析教程
- 拓扑图介绍及相关功能
热门文章
- Ubuntu 修改用户名
- 一个屌丝程序猿的人生(三十五)
- python作业:有一个学生成绩表,包括学号、姓名、高数、英语,计算机。 录入若干个学生学号、姓名、高数、英语,计算机5项数据。 将学生成绩表数据写入文件,文件名为“学生成绩表.txt
- SDCC 2016上海、深圳、成都、杭州回顾,北京站将带来什么?
- 牛客网输入输出练习c++ 个人版题解
- svn服务器web项目,liunx 搭建svn服务器并实现钩子自动更新到web项目
- thinksns java_ThinkSNS+ 更新播报
- 自由Android安全研究员陈愉鑫:移动App灰色产业案例分析与防范
- 笔记:GIT配置和命令
- SDUTOJ 3034 ——炸学校