您当前的位置:首页 > 电脑百科 > 软件技术 > 软件技术

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

时间:2020-03-14 15:32:08  来源:  作者:

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
@Override
public void Example1(User user) {
    userMApper.insert(user);
    propagationService.required();
}
@Transactional
@Override
public void required() {
    throw new NullPointerException;
}

单元测试

@Test
public void testExample1() throws Exception {
    User user = new User();
    user.setName;
    userService.Example1(user);
}

案例二:try-required

开始敲黑板划重点了,这个情况也是大家最常见的情况之一,但是由于这个try起来了,异常不会抛出,那么,这个insert能否插入数据呢?

@Transactional
@Override
public void Example2(User user) {
    userMapper.insert(user);
    try {
        propagationService.required();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Transactional
@Override
public void required() {
    throw new NullPointerException;
}

单元测试

@Test
public void testExample2() throws Exception {
    User user = new User();
    user.setName;
    userService.Example2(user);
}

案例三:try-requiresNew

这个案例和上面的案例很相似,区别在于,这里的隔离级别是Propagation.REQUIRES_NEW,那么,这个insert能否插入数据呢?

@Transactional
@Override
public void Example3(User user) {
    userMapper.insert(user);
    try {
        propagationService.requiresNew();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void requiresNew() {
    throw new NullPointerException;
}

单元测试

@Test
public void testExample3() throws Exception {
    User user = new User();
    user.setName;
    userService.Example3(user);
}

案例四:常规情况

这个和案例一很想,结果会有差别吗?最后insert能插入吗?

@Transactional
@Override
public void Example4(User user) {
    userMapper.insert(user);
    propagationService.requiresNew();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void requiresNew() {
    throw new NullPointerException;
}

单元测试

@Test
public void testExample4() throws Exception {
    User user = new User();
    user.setName;
    userService.Example4(user);
}

解密及大白话说明原理

案例一

这个不用说,稍微有点JAVA常识的人都知道,异常必然会导致回滚,数据库不会插入数据。

案例二

这个到底会不会插入数据呢?毕竟这个异常被try起来了。这个时候,正常的思维都会认为,能正常插入数据,但是答案是,不会插入数据,并且抛出异常

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

为啥会这样呢?

案例三

这个和案例二很像,因为有了案例二的阴影,这个时候你就变得不确定了。答案是,能正常插入数据。

案例四

这个和案例一很像,本来你是很确定能不能插入数据的,但是有了案例三的阴影之后,这个时候你又变得不确定了。答案是,不会插入数据。

原理!

这四个案例,只要你把这四个案例和原理弄熟,再复杂的各种try模型下,事务是否回滚,你都清清楚楚。

我们先来看看@Transactional的核心方法

	if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
		// 开启事务
		TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
		Object retVal = null;
		try {
			// 执行业务方法
			retVal = invocation.proceedWithInvocation();
		}
		catch (Throwable ex) {
			// 回滚事务
			completeTransactionAfterThrowing(txInfo, ex);
			throw ex;
		}
		finally {
			cleanupTransactionInfo(txInfo);
		}
		// 提交事务
		commitTransactionAfterReturning(txInfo);
		return retVal;
	}

我们重点解析案例二和案例三的情况。我们再把那两个事务传播机制的意思来解读一下:

PROPAGATION_REQUIRED:Spring的默认传播级别,如果上下文中存在事务则加入当前事务,如果不存在事务则新建事务执行。

PROPAGATION_REQUIRES_NEW:该传播级别每次执行都会创建新事务,并同时将上下文中的事务挂起,执行完当前线程后再恢复上下文中事务。

首先来看案例二,执行Example2方法的时候,由上文得知,将开启一个事务,再执行到required方法时,此时,因为用得的默认的隔离级别,因此,这个时候,会加入到刚才的事务之中,然后required方法中,出现了异常,我们来看

completeTransactionAfterThrowing(txInfo, ex);

中的核心方法

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

 

从doSetRollbackOnly(status)这个单词就知道,required的时候,已经把这个事务设置成RollbackOnly,因此,虽然try住了,但是Example2执行完提交的时候,却发现无法提交,所以异常信息如下:

Transaction rolled back because it has been marked as rollback-only

一图胜千言,我用一张图来描述这个关系

 

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

 

那为啥案例三,又能插入数据呢?还是用一张图来描述

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

 

需要注意

@Transactional有很多注意点

  • 在同个类中调用A方法调用B方法,B方法是不会开启事务,自然也就不会用到事务的传播机制。这个原理后续肥朝会解析,当然如果你连这句话都不知道是什么意思,假粉实锤了!
  • @Transactional默认情况下,只回滚RuntimeException。如果你抛出的异常不是RuntimeException,可能导致在默认情况下和本文有所偏差

当然,这么多注意点,哪记得住,因此,留意后续的原理解析,就非常有必要了。

 



Tags:程序员   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
我 2010 年开始在 Github 上开源自己的代码。在 push 代码之前我根本没想过为什么。只是因为我当时学了 git,而且我又觉得 Github 很方便,可以用来备份自己的代码。而后我就参...【详细内容】
2021-12-28  Tags: 程序员  点击:(2)  评论:(0)  加入收藏
JAVA开发工程师(北京)本科 3-5年经验 面议 (招1人)岗位职责:1.负责我行应用系统的设计,完成软件编码工作,负责管理代码设计规范等工作;2.根据应用需求分析说明书,评估需求研发的可行...【详细内容】
2021-12-27  Tags: 程序员  点击:(2)  评论:(0)  加入收藏
今天聊聊编程的本质。程序就是数据结构+控制+逻辑,程序员编程工作的本质是翻译,翻译机要来了,程序员怎么办?黑客帝国中的程序黑客帝国4就要上映了,不知道前三部你看懂了么?值得多...【详细内容】
2021-12-17  Tags: 程序员  点击:(9)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  Tags: 程序员  点击:(18)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  Tags: 程序员  点击:(21)  评论:(0)  加入收藏
梦醒之后,每个人对于这份职业的未来、互联网行业的未来,以及更重要的,自己的未来都有了更现实的判断 文 | 祝颖丽编辑 | 黄俊杰一个生于 1986 年的人,他所走过的前半生:从出生起,...【详细内容】
2021-12-03  Tags: 程序员  点击:(16)  评论:(0)  加入收藏
前些天在头条看到一个八二年的哥们,述说自己找工作屡次被拒的问题,在网上引起了广泛的讨论,这件事给我留下了很深的印象,因为这哥们和我同是程序员,都人到中年,上有老下有小。唯一...【详细内容】
2021-12-01  Tags: 程序员  点击:(20)  评论:(0)  加入收藏
很多读者都问过一个问题:程序员如何实现高速成长?之前也写过相关的文章,强调的主要是夯实计算机体系基础知识。 再说另一个诀窍:多看经典开源项目,这些项目大多是众多顶尖程序员...【详细内容】
2021-11-30  Tags: 程序员  点击:(15)  评论:(0)  加入收藏
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  Tags: 程序员  点击:(34)  评论:(0)  加入收藏
近日,一位45岁的网民在中国政府网留言求职,引发关注。该网民自称是一名软件开发人员,今年45岁,精通各种技术体系,“而我辞职回家半年后再回来寻找工作机会的时候,却发现连个面试...【详细内容】
2021-11-17  Tags: 程序员  点击:(42)  评论:(0)  加入收藏
▌简易百科推荐
现在很多手机的摄像头都会比电脑的高,因此有不少小伙伴想要在有些时候用手机摄像头代替电脑摄像头,那么具体应该如何操作呢?下面就和小编一起来看看连接手机摄像头的方法吧。更...【详细内容】
2021-12-28  装机吧    Tags:Win10   点击:(2)  评论:(0)  加入收藏
今天教大家通过windows的CMD终端查看WIFI密码 使用管理权限打开CMD 查看本机连接过WIFI名称netsh wlan show profiles 查询某一个WIFI的密码比如这里我想查询猪猪侠的...【详细内容】
2021-12-27  吉祥同学学安全    Tags:wifi密码   点击:(1)  评论:(0)  加入收藏
从本质上来讲,PE系统最广泛的用途只是用来安装系统。通过其内置的Ghost软件来调用第三方的GHO系统镜像来完成系统的安装。从表面来看,最终的系统是否纯净、是否安全,与Gho镜像...【详细内容】
2021-12-27  u盘装系统    Tags:pe工具   点击:(3)  评论:(0)  加入收藏
Safari是苹果在iPhone和iPad上的默认网络浏览器。虽然我们天天都在使用,但是,你是否深入研究了Safari的所有功能和设置?"无痕浏览"、"阅读器"视图和下载文件等标准选项只是其...【详细内容】
2021-12-16  趣玩公社    Tags:Safari   点击:(21)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个开源的 HTML5 视频播放器插件——MuiP...【详细内容】
2021-12-16  GitHub精选    Tags:插件   点击:(23)  评论:(0)  加入收藏
给电脑安装软件,最让人担心的就是安装到“拖家带口”的,而这样的手法正是国产软件惯用的!全家桶自动安装、软文弹窗等等,这些让我们讨厌的却是软件的直接收入来源。 那么在你安...【详细内容】
2021-12-15  老毛桃winpe    Tags:软件   点击:(18)  评论:(0)  加入收藏
不知道你是否遇到过这么一种情况:在一个A4大小的图框画一个接近满框的图形,在打印的时候却发现图形很小根本不符合模型空间的实际情况。看似明显是比例问题,但又不知道究竟是什...【详细内容】
2021-12-14  设计师小仁君    Tags:CAD   点击:(21)  评论:(0)  加入收藏
哈喽大家好! 前几天一个朋友向我疯狂吐槽。 快到年底了,公司要统计年度数据。 需要把一月到十二月份,十二张表格的数据,全部汇总到一个表格内。 这样的数据汇报每年都会有,每到年...【详细内容】
2021-12-14  秋叶Excel    Tags:Excel   点击:(23)  评论:(0)  加入收藏
我发现最近不少小叶子的留言都和 Excel 相关,我寻思是时候出一期解决 Excel 疑难杂症的小合集了。于是毛毛在众多问题中,挑了三个被问次数最多的有关 Excel 的问题,今天就来给...【详细内容】
2021-12-14  叶PPT    Tags:Excel   点击:(30)  评论:(0)  加入收藏
大家好,我是Stark-C。油猴简介【油猴】一款免费的浏览器扩展和最为流行的用户脚本管理器,它是一个附加组件(扩展程序),让用户安装一些脚本使大部分HTML为主的网页改变得更方便易...【详细内容】
2021-12-13  什么值得买    Tags:油猴   点击:(46)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条