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的问题也可以私信我 能帮忙解决的尽量解决

 

最新文章

  1. Jquery学习笔记 --ajax删除用户,使用了js原生ajax
  2. 网页for循环get测试
  3. SPOJ bsubstr
  4. android service 本地 远程 总结
  5. A trip through the Graphics Pipeline 2011_13 Compute Shaders, UAV, atomic, structured buffer
  6. Sqlite3 设置插入触发器
  7. UVA5874 Social Holidaying 二分匹配
  8. 锋利的jQuery-1-- :的用法
  9. 【BZOJ】1468: Tree(点分治)
  10. 每天一道LeetCode--344. Reverse String
  11. AngularJs--过滤器(filter)
  12. Jquery学习笔记1-jquery总体代码框架
  13. Makefile里调用Shell注意点
  14. 201521123027 <java程序设计>第13周学习总结
  15. Java作业-网络编程
  16. Uva - 1589 - Xiangqi
  17. 对接https数据(3des加密)
  18. CSS中默认被继承的属性
  19. nginx学习笔记(一)
  20. 自定义bootbox:dialog方法

热门文章

  1. spring-ioc知识点
  2. node 创建服务器方法
  3. ES6 学习笔记(四)基本类型Number
  4. 04 uniapp/微信小程序 项目day04
  5. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents
  6. 查看服务器出口ip
  7. SketchUp2020免费中文完整版官网2021教程模型库下载
  8. C++ undered_map哈希表用法——leetcode两数之和
  9. Dive into TensorFlow系列(2)- 解析TF核心抽象op算子
  10. 8 STL-stack