java 异步调用 事务_@Transactional事务提交后触发异步方法
一、问题复现
1.场景
2个service方法, 方法A中调用方法B。
方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollbackFor = Exception.class)
方法B 比较耗时,为了不影响核心业务,方法B 用@Async注解,单独开启一个线程去异步执行。(方法B在另外一个类里边,不能和A在同一个类)。
2.出错原因
方法B是异步方法,导致方法A事务还没提交时(不一定出错,具体就看哪个线程执行的快了)方法B就执行了。
3.期望
期望方法A上的大事务commit后再执行方法B。
二、解决方案
1 //注册事务同步处理
2 TransactionSynchronizationManager.registerSynchronization(newTransactionSynchronizationAdapter() {3 @Override4 public voidafterCommit() {5 //事务提交完毕时,触发:funcB
6 funB();7 }
三、原理
提交一个事务同步处理,在事务commit之后执行,具体存放在threadLocal(线程本地变量)中,事务commit时会去threadLocal里边取。源码afterCommit是空的,没有任何操作,可见是spring专门预留给大家使用的。
源码:
TransactionSynchronizationAdapter是一个接口适配器,这样不用实现接口的全部方法,按需Override即可。类图如下图所示:
TransactionSynchronizationAdapter实现了2个接口:
TransactionSynchronization事务同步接口,
Ordered执行优先级
我们这里就是实现了TransactionSynchronization接口的afterCommit()方法,最终在事务commit提交后执行。
关于spring事务执行过程图:
四、总结
遇到问题后,很快就想到了处理方式,因为我提前储备了相关知识:
1.spring事务系列(具体在第三章 事务源码,里边有链接)
2.@Async实现异步
3.threadLocal线程本地变量
java 异步调用 事务_@Transactional事务提交后触发异步方法相关推荐
- java 异步调用方法_乐字节Java编程之方法、调用、重载、递归
一.概述 方法是指人们在实践过程中为达到一定目的和效果所采取的办法.手段和解决方案. 所谓方法,就是解决一类问题的代码的有序组合,是一个功能模块.编程语言中的方法是组合在一起来执行操作语句的集合.例如 ...
- Java异步调用的几种方式
一.通过创建新线程 二.通过线程池 三.通过@Async注解 四.通过CompletableFuture 日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结 ...
- java 异步调用方法_java异步调用方法有哪些?如何实现异步调用?
你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧! 1.利用Spring的异步方法去执行 注:没有返回值 在启动类又或者是配置类加 ...
- java 异步调用 事务_深入理解Spring注解@Async解决异步调用问题
序言:Spring中@Async 根据Spring的文档说明,默认采用的是单线程的模式的.所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的. 那么当多个任务的执行势必会相互影响. ...
- java mysql数据库回退_数据库事务及Java中的处理
事 务是指一组相互依赖的操作行为,举一个举得不能再被举的例子就是银行交易,当然还有其他像网上购物,电子货币交易等等,事务的成功取决于这些相互依赖的操 作行为是否都能执行成功,只要有一个操作行为失败,就 ...
- rabbit和mysql事务_分布式事务原理及SpringBoot整合RabbitMQ实现可靠事件,TCC事务模型及接口幂等性...
分布式事务 我们知道在单数据库系统中,实现数据的一致性,通过数据库的事务来处理比较简单.在微服务或分布式系统中,各个独立的服务都会有自己的数据库,而不是在同一个数据库中,所以当一组事务(如商品交易中, ...
- mysql ef6 事务_使用事务-EF6 | Microsoft Docs
使用事务Working with Transactions 10/23/2016 本文内容 备注 仅限 EF6 及更高版本 - 此页面中讨论的功能.API 等已引入实体框架 6.EF6 Onwards ...
- ole db 访问接口 sqlncli 无法启动分布式事务_分布式事务,看这篇就够了
0. 前言 1. 单数据源事务 & 多数据源事务 2. 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交( ...
- 服务器无法执行该事务_分布式事务、MVCC、事务隔离级别
我们都知道,OceanBase 是一个分布式数据库,数据是打散到多台服务器上的,当一个分布式事务要执行的时候,可能需要跨越多台 OB Server,如果在执行过程中遇到各种各样的异常情况,OceanB ...
最新文章
- Pivotal Tuning for Latent-based Editing of Real Images
- ppt的一些基础操作
- shell的if判断比较
- EJB和JavaBean的区别
- Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
- linux日志.pdf,一种用于LINUX的AUDIT日志分析方法.pdf
- File类和时间类的两道综合练习
- PHP中文分词扩展 SCWS
- idea导入本地idea的web项目(服务器用的是tomcat)
- Python访问MySQL数据库速度慢解决方法
- 《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》笔记
- C语言编程的双大于号,VC 双小于 双大于号
- C语言把十进制转换为二进制数的方法和示例
- C语言输入Aa1Bb2Cc3,C语言shuzu_test.doc
- 手机写python脚本_用Python写王者荣耀刷金币脚本
- mysql查询同名同姓重名人数,查全国同名同姓人数,姓名重名查询系统全国
- python,使用微信远程控制电脑或使用微信定时发送消息关于QR.png报错的解决办法
- 让手机支持OTG,不看绝对后悔! - 我也做一回搬运工,解决RFID读卡器OTG支持问题
- java计算机毕业设计教师继续教育MyBatis+系统+LW文档+源码+调试部署
- mysql修改字段设置_在mysql中,如何改变列声明.