栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring的七种事务传播行为,通俗易懂,绝不笼统,可以背诵,应付面试

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring的七种事务传播行为,通俗易懂,绝不笼统,可以背诵,应付面试

文章目录
  • 什么是事务传播行为
  • PROPAGATION_REQUIRED
  • PROPAGATION_NESTED
  • PROPAGATION_REQUIRES_NEW
  • PROPAGATION_SUPPORTS
  • PROPAGATION_NOT_SUPPORTED
  • PROPAGATION_MANDATORY
  • PROPAGATION_NEVER

复习spring的时候,发现网上说的spring其中事务传播行为,说的不太好,根本没有说到通俗易懂这个点子上,要么就是一顿抄,估计他自己都不懂什么意思,以为背一下就可以应付面试了,但是面试官听到你这么笼统的回答,估计就知道你是背面试题的人了.

什么是事务传播行为

这句话网上说的很清楚: 事务传播行为时指,如果某个事务方法被另一个事务方法调用,该事务方法该如何执行,事务的行为时怎么样的.

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,这句话你们肯定懂.如果有事务,就加入到该事务中来,记住,加入是合并成一个事务,所以之后这是一个事务.

那么,就会产生一种现象: 因为成了一个事务,形成了一个整体,所以外围方法回滚了,里面的方法也会回滚,里面的方法回滚了,外围的也会回滚.

PROPAGATION_NESTED

我为什么要将这个放在第二个来说,因为这个很容易搞混了,如果你去查一下就知道,大多数博主就说出了: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作.

我不得不谴责,对于我们这种小白来说,这些博主是很不负责任的,那种抄袭的博主更加不负责任,纵然他们的抄袭可能是从某个大牛或者书上来的,但也是照搬的,千篇一律,明明原文说的很难理解,只有高手能理解,却硬生生搬下来了强行让别人去理解,面试官问深点估计就不懂(可能我期望太高了,很多博主估计就是从哪个角落的博客搬过来的,那些什么所谓csdn专家,什么什么尤其详细的面经,啊呀,你们还真敢说啊,你自己搬过来的时候恐怕都没有看吧,有些概念直接弄反,错别字还一大堆,还那么多浏览量,真是假,太假了!最可气的是什么,你发现看什么最详细的面经的时候,看不懂是网上找,发现这些人沆瀣一气,全是那个吊样,答案全是一样的,甚至人家因为"<>"号而显示不出来的内容都直接空了出来,这种人明显就是一顿复制的,我知道有可能有些人是为了记录一下,让自己看,那你可以设置成私有的啊,干嘛要公布出来让别人浏览到啊,搞得一个博客平台乌烟瘴气,就算你没有搬抄的心里,那你最好写个转载的啊,为啥还要原创啊,原创还能过我真是服了!!!)

回到正题:
这个界别的意思是,如果当前存在事务,就加入到该事务中执行,如果当前没有事务,就和第一个一样,就新建一个事务.

听完我的解释是不是很蒙蔽?

怎么和第一个重复了,很多人说的就是这个样子,我也就这么说了,但是这里我不得不多说一句,如果是这种级别,加入到该事务中的时候,自己还是一个事务,也就是没有融合当前事务,这里会出现两个事务,那么如果出现回滚的场景: 如果外部事务回滚,因为内部事务镶嵌进来了,所以内部也会回滚,即内部因外部回滚而回滚,但反过来,如果内部先回滚,外部不会因为内部而回滚.这是和第一个有本质区别的,但你要记住,这个事务是一个子事务,不是独立的一个事务,你也可以这么理解,因为嵌套在事务内执行,所以成为了外围事务的子事务,所以外围事务是会影响子事务的.(这个特性就有点像继承关系了)

现在是不是理解第一个和第二个事务传播的区别了?

PROPAGATION_REQUIRES_NEW

这个我特地放在第三个来说,是因为其定义好理解,但是回滚不好理解.

网上这么说:新建一个事务去执行,如果当前存在事务,把当前事务挂起。

这句话好理解吧,但是在回滚层面来说: 如果外部事务回滚,里面的事务是不受影响的,因为在这个传播行为中,里面的事务是新建的(就算它本来有事务),虽然是在里面被调用,但是却不是子事务,而是一个隔离的事务,也就是说,二者的回滚策略是互相隔离的,无论哪个回滚,都不会影响到彼此.

PROPAGATION_SUPPORTS

如果当前有事务,就加入到该事务中,成为一个事务,如果没有事务,自己也不会创建事务.

这句话不难理解,但这个事务传播行为时没用的,因为有事务加入了也变成了一个事务,这跟加不加都一样,而没有事务自己也不会创建事务,所以这个传播行为时没有意义的.

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

这个传播行为的好处是,因为是以非事务方式执行操作,所以就不存在回滚,就不存在对当前事务的回滚的影响.

PROPAGATION_MANDATORY

必须被一个开启了事务的方法调用自己,不然就报错.

这个更狠,如果当前方法不是事务,就报错,要求当前方法一定要是事务.

PROPAGATION_NEVER

这个和上一个相反,一定要以非事务的方式调用它,如果存在事务,就报异常.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/839551.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号