Java程序员只会CRUD连Spring事务传播机制都不懂?

AQS到底有什么用?难道就真的只是为了面试吗?
当然不是说AQS没用 , 如果你不是做基础架构或者中间件开发 , 你很难感受到AQS的威力 。当然 , 学习很多时候 , 需要的是正向反馈 , 学了太多造火箭的东西 , 面试完就再也用不上 , 自然很难有动力保持持续学习 。那么 , 有没有受众群体大 , 就算平时CRUD的同学也用得到 , 同时面试又喜欢问 , 最重要的是 , 出问题的时候 , 搜索还不容易搜索出答案的知识点?
那么 , 这个就是肥朝之前提到的Spring事务传播机制 。
为啥是Spring事务传播机制?原因很简单 , 因为能满足上述三个条件的 , 第一个想到的 , 就是Spring事务传播机制 , 他具备了几个条件
1.CRUD的同学 , 平时和事务打交道最多 。并且 , 事务一旦出了问题 , 那可是爆炸性的伤害 , 这点毋容置疑
2.面试高频考点 , 一般还会问数据库的隔离级别 。但是肥朝发现 , 很多同学把数据库的隔离级别和Spring的事务传播机制这两个概念搞混 , 其实这是两码事 。同时 , 也有比较出名的面试题 , "做51次操作 , 前面50次成功 , 第51次失败 , 如何把前面成功的50次提交 , 第51次失败的回滚" 。如果你对Spring的事务传播机制不了解 , 那么你对于这个问题 , 是没有什么头绪的 , 原因在于 , 很多同学平时只处理过 , 全部提交和全部回滚两个情况 。
3.即使你在别的地方看过类似的Spring事务传播机制的文章 , 对于常规的情况是没问题 , 但是如果在多个try模型下 , 你对于是否能回滚 , 心里还是没底的 , 说白了 , 就是你还是没能摸透原理!
4.最重要的当然是肥朝之前答应过大家要写这篇 , 不想做渣男 。
 
 
 
基本概念Spring的事务传播机制有以下七种

PROPAGATION_REQUIRED:Spring的默认传播级别 , 如果上下文中存在事务则加入当前事务 , 如果不存在事务则新建事务执行 。
PROPAGATION_SUPPORTS:如果上下文中存在事务则加入当前事务 , 如果没有事务则以非事务方式执行 。
PROPAGATION_MANDATORY:该传播级别要求上下文中必须存在事务 , 否则抛出异常 。
PROPAGATION_REQUIRES_NEW:该传播级别每次执行都会创建新事务 , 并同时将上下文中的事务挂起 , 执行完当前线程后再恢复上下文中事务 。(子事务的执行结果不影响父事务的执行和回滚)
PROPAGATION_NOT_SUPPORTED:当上下文中有事务则挂起当前事务 , 执行完当前逻辑后再恢复上下文事务 。(降低事务大小 , 将非核心的执行逻辑包裹执行 。)
PROPAGATION_NEVER:该传播级别要求上下文中不能存在事务 , 否则抛出异常 。
PROPAGATION_NESTED:嵌套事务 , 如果上下文中存在事务则嵌套执行 , 如果不存在则新建事务 。(save point概念)
看完这七种是不是云里雾里?那就对了!坦白说 , 这七种你记得住 , 其实也没多大意义 , 记得住多半也是背下来的 。其中PROPAGATION_REQUIRED这种默认的情况 , 是我们用得最多的 , 基本覆盖90%的情况,也就是大家常见的 , 一起回滚的情况 。还有一个是PROPAGATION_REQUIRES_NEW 。基本你把这两个掌握了 , 应对95%的情况一点儿问题都没有 , 如果还有问题 , 你再来查这七种 , 找到你合适的 。
例题讲解如果只是罗列概念 , 那意义不大 , 因此我们采用应试教育的方式来做题 , 才是检验掌握程度比较好的做法
案例一:常规情况这种也是大家最常见的情况
@Transactional@Overridepublic void Example1(User user) {userMApper.insert(user);propagationService.required();}@Transactional@Overridepublic void required() {throw new NullPointerException;}单元测试
@Testpublic void testExample1() throws Exception {User user = new User();user.setName;userService.Example1(user);}


推荐阅读