Spring异步Async和事务Transactional注解
Spring开发中我们我们常常用到@Transaction和@Async,但这2个注解加在一起很多的开发者不敢用,担心事务不生效。下面我们就仔细讲解一下这2个注解同时运用,文章用3个场景讲述它们之间的运用,相信看完本篇文章你就能灵活运用这2个注解了。
场景一:@Async + @Transaction放在一个方法中,并且方法有异常发生

进行单元测试如下:

运行结果:事务回滚了,user没有新增进入数据库。
场景二:一个同步的方法,调用异步的方法,同步的方法抛出异常。


然后同样运行上面的单测。PS至于上面为什么用applicationContext获取Bean不在本次讲解的范畴,是属于事务是否生效的知识点,如果想知道为什么后续文章进行讲解,可以点一下关注。
结果:第一个方法数据回滚了,第二个异步的数据保存成功了。
场景三:一个同步方法,调用2个异步的方法,2个异步的方法都抛出异常。

同样运行上面的单测。
结论:第一个同步方法保存数据成功,第二个和第三个异步方法保存数据失败。
上面的三个场景大概,概括了我们开发中的使用的场景,由上面的场景也可以得出结论:不同线程之间的事务完全隔离,异步线程内完全可以调用异步线程。
然后我们讲解一下第一种场景为什么事务加异步的方法能生效,大部分的开发者都对此有疑问。因为事务生效只在同一个线程中才能生效而使用异步方法时Sping又新创建了一个线程,以为这个事务不生效的,其实是生效的。我们知道不管是异步还是事务都是Spring运用了它的特性Aop。Aop中切面有一个执行顺序的注解,如下是Spring事务的默认的order
int LOWEST_PRECEDENCE = Integer.MAX_VALUE;

spring事务切面order为最大的整数值,也就是说它的执行优先级是最低的。所以可以知道Async异步的切面先执行,事务的切面后执行,通俗理解异步包裹了事务的执行,所以可以说事务是在异步的那个线程里面执行的,所以也就理解了为什么事务会生效。
微信公众号搜索:程序员xiaozhang 。如果遇到Spring的问题也可以私信我 能帮忙解决的尽量解决
Spring异步Async和事务Transactional注解的更多相关文章
- Spring异步-@Async注解
Spring异步:@Async注解 使用@Async前需要开启异步支持:@EnableAsync 注解和XML方式 @Async返回值的调用:需要使用Future包装 1.如果没有使用Future包装 ...
- 对于spring中事务@Transactional注解的理解
现在spring的配置都喜欢用注解,这边就说下@Transactional 一.如何开启@Transactional支持 要使用@Transactional,spring的配置文件applicatio ...
- 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...
- Spring的声明式事务----Annotation注解方式(2)
使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...
- 事务@Transactional注解的属性
事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.事务的传播行为可以由传播属性指定.Sprin ...
- 【动态数据源切换失败】由于事务@Transactional注解导致动态数据源切换失效的问题
不多BB,直接上代码: public class DataSourceKey { /** * 用户数据源 */ public final static String USER = "user ...
- Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)
一.事务的传播行为1.介绍 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.2.属性 事务的传播行为可以由传 ...
- Spring的声明式事务----Annotation注解方式(1)
这里列一个小的demo工程,直接利用Spring的jdbcTemplate访问Mysql数据库. 工程结构: 数据库中的tbl_student表结构如下: 数据实体类Student.java代码如下: ...
- Spring Boot中Service用@Transactional 注解
一般来说function2和function1用的是同一个Transaction. 这个取决于@Transactional 的 propagation设置(事务的传播性) 默认的是 1 @Transa ...
- spring4声明式事务--01注解方式
1.在spring配置文件中引入 tx 命名空间 xmlns:tx="http://www.springframework.org/schema/tx" 2.配置事务管理器 < ...
随机推荐
- springboot如何处理矩阵参数类型的url
矩阵参数类型的url如何处理 首先要开启这个功能 在webconfig类中创建Webconfigurer类 并且设置 urlPathHelper类中的removeSemicolonContent 为f ...
- Spring Boot中@Import三种使用方式!
需要注意的是:ImportSelector.ImportBeanDefinitionRegistrar这两个接口都必须依赖于@Import一起使用,而@Import可以单独使用. @Import是一个 ...
- 【element】el-table-column日期格式化
要对一列日期进行格式化.可使用formatter属性,它用于格式化指定列的值,接受一个Function,会传入两个参数:row和column,可以根据自己的需求进行处理. 参阅element官网 在e ...
- 165 pbi-utils 使用文档
165 pbi-utils 使用文档 一.背景 先来说一下为什么会有 pbi-utils 这个小工具吧.在我日常做演示的示例文件的时候,每次都要重新搞一次 Power BI Desktop,就想能不能 ...
- linux配置 python 开发环境sublime text及一些使用心得
前言 一直以来我都使用 sublime text 作为主流开发的 ide ,但其实我开始在我的 linux mint 系统使用 sublime text 配置 python3 的开发环境踩过的坑又何止 ...
- oracle 内置函数(三)日期函数
日期函数概要: 系统时间 日期操作 一.系统时间 sysdate:还是西方的格式,我们一般需要to_char(date,'yyyy-mm-dd hh24:mi:ss') next_day:当前日期的下 ...
- VBA驱动SAP GUI自动化:查找页面元素FindAllByName
我们在VBA中嵌入SAP原生的[脚本录制与回放]功能生成的VBS脚本,可以实现很多自动化操作.但只有我们对SAP做了一系列动作,才会得到这些动作的脚本.然而,一旦我们需要用代码提前做一些判断,然后再决 ...
- 多表查询、Navicat软件、PyMySQL模块
目录 多表查询.Navicat软件.PyMySQL模块 一.多表查询的两种方法 1.准备工作 2.第一种:连表操作 3.第二种:子查询 总结与结论: 二.多表查询练习题 1.课堂多表查询练习题 2.以 ...
- HCIE Routing&Switching之MPLS静态LSP配置
前文我们了解了MPLS基础理论部分,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16928096.html:今天我们来聊一聊MPLS静态LSP配置相关话题: ...
- Blender修改视野范围
首先,我不是专门的建模人员.但是有时候会拿到建模人员的制作的模型导入进行修改. 比如简单的删除某个模型,调整模型的尺寸. 还有就是调整模型的建模中心点,这点有时候显得特别重要,模型的中心点偏离较大会给 ...