一、问题复现

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事务提交后触发异步方法相关推荐

  1. java 异步调用方法_乐字节Java编程之方法、调用、重载、递归

    一.概述 方法是指人们在实践过程中为达到一定目的和效果所采取的办法.手段和解决方案. 所谓方法,就是解决一类问题的代码的有序组合,是一个功能模块.编程语言中的方法是组合在一起来执行操作语句的集合.例如 ...

  2. Java异步调用的几种方式

    一.通过创建新线程 二.通过线程池 三.通过@Async注解 四.通过CompletableFuture 日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结 ...

  3. java 异步调用方法_java异步调用方法有哪些?如何实现异步调用?

    你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧! 1.利用Spring的异步方法去执行 注:没有返回值 在启动类又或者是配置类加 ...

  4. java 异步调用 事务_深入理解Spring注解@Async解决异步调用问题

    序言:Spring中@Async 根据Spring的文档说明,默认采用的是单线程的模式的.所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的. 那么当多个任务的执行势必会相互影响. ...

  5. java mysql数据库回退_数据库事务及Java中的处理

    事 务是指一组相互依赖的操作行为,举一个举得不能再被举的例子就是银行交易,当然还有其他像网上购物,电子货币交易等等,事务的成功取决于这些相互依赖的操 作行为是否都能执行成功,只要有一个操作行为失败,就 ...

  6. rabbit和mysql事务_分布式事务原理及SpringBoot整合RabbitMQ实现可靠事件,TCC事务模型及接口幂等性...

    分布式事务 我们知道在单数据库系统中,实现数据的一致性,通过数据库的事务来处理比较简单.在微服务或分布式系统中,各个独立的服务都会有自己的数据库,而不是在同一个数据库中,所以当一组事务(如商品交易中, ...

  7. mysql ef6 事务_使用事务-EF6 | Microsoft Docs

    使用事务Working with Transactions 10/23/2016 本文内容 备注 仅限 EF6 及更高版本 - 此页面中讨论的功能.API 等已引入实体框架 6.EF6 Onwards ...

  8. ole db 访问接口 sqlncli 无法启动分布式事务_分布式事务,看这篇就够了

    0. 前言 1. 单数据源事务 & 多数据源事务 2. 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交( ...

  9. 服务器无法执行该事务_分布式事务、MVCC、事务隔离级别

    我们都知道,OceanBase 是一个分布式数据库,数据是打散到多台服务器上的,当一个分布式事务要执行的时候,可能需要跨越多台 OB Server,如果在执行过程中遇到各种各样的异常情况,OceanB ...

最新文章

  1. Pivotal Tuning for Latent-based Editing of Real Images
  2. ppt的一些基础操作
  3. shell的if判断比较
  4. EJB和JavaBean的区别
  5. Leetcode每日一题:33.search-in-rotated-sorted-array(搜索旋转排序数组)
  6. linux日志.pdf,一种用于LINUX的AUDIT日志分析方法.pdf
  7. File类和时间类的两道综合练习
  8. PHP中文分词扩展 SCWS
  9. idea导入本地idea的web项目(服务器用的是tomcat)
  10. Python访问MySQL数据库速度慢解决方法
  11. 《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》笔记
  12. C语言编程的双大于号,VC 双小于 双大于号
  13. C语言把十进制转换为二进制数的方法和示例
  14. C语言输入Aa1Bb2Cc3,C语言shuzu_test.doc
  15. 手机写python脚本_用Python写王者荣耀刷金币脚本
  16. mysql查询同名同姓重名人数,查全国同名同姓人数,姓名重名查询系统全国
  17. python,使用微信远程控制电脑或使用微信定时发送消息关于QR.png报错的解决办法
  18. 让手机支持OTG,不看绝对后悔! - 我也做一回搬运工,解决RFID读卡器OTG支持问题
  19. java计算机毕业设计教师继续教育MyBatis+系统+LW文档+源码+调试部署
  20. mysql修改字段设置_在mysql中,如何改变列声明.

热门文章

  1. fastjson判断一个json是jsonArray还是jsonObject几种方式
  2. 政考网:公务员考试常识100题,你能答对几个?
  3. (附源码)计算机毕业设计ssm二手书交易软件设计与实现
  4. 一条调整的消息(第15期)
  5. RC滤波器、时域、频域分析笔记A
  6. 关于Nacos的心跳机制
  7. 成都web前端前景怎么样?好找工作吗?
  8. samle-install.nsi.bat
  9. Idea 替换 区分大小写
  10. 苹果如何把游戏隐藏在计算机里面,苹果桌面上的游戏怎么隐藏