大家好,我是你的好朋友思创斯。今天说一说spring的七种事务传播行为,通俗易懂,绝不笼统,可以背诵,应付面试,希望您对编程的造诣更进一步.
文章目录
复习spring的时候,发现网上说的spring其中事务传播行为,说的不太好,根本没有说到通俗易懂这个点子上,要么就是一顿抄,估计他自己都不懂什么意思,以为背一下就可以应付面试了,但是面试官听到你这么笼统的回答,估计就知道你是背面试题的人了.
这句话网上说的很清楚: 事务传播行为时指,如果某个事务方法被另一个事务方法调用,该事务方法该如何执行,事务的行为时怎么样的.
如果当前没有事务,就新建一个事务,这句话你们肯定懂.如果有事务,就加入到该事务中来,记住,加入是合并成一个事务,所以之后这是一个事务.
那么,就会产生一种现象: 因为成了一个事务,形成了一个整体,所以外围方法回滚了,里面的方法也会回滚,里面的方法回滚了,外围的也会回滚.
我为什么要将这个放在第二个来说,因为这个很容易搞混了,如果你去查一下就知道,大多数博主就说出了: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作.
我不得不谴责,对于我们这种小白来说,这些博主是很不负责任的,那种抄袭的博主更加不负责任,纵然他们的抄袭可能是从某个大牛或者书上来的,但也是照搬的,千篇一律,明明原文说的很难理解,只有高手能理解,却硬生生搬下来了强行让别人去理解,面试官问深点估计就不懂(可能我期望太高了,很多博主估计就是从哪个角落的博客搬过来的,那些什么所谓csdn专家,什么什么尤其详细的面经,啊呀,你们还真敢说啊,你自己搬过来的时候恐怕都没有看吧,有些概念直接弄反,错别字还一大堆,还那么多浏览量,真是假,太假了!最可气的是什么,你发现看什么最详细的面经的时候,看不懂是网上找,发现这些人沆瀣一气,全是那个吊样,答案全是一样的,甚至人家因为”<>”号而显示不出来的内容都直接空了出来,这种人明显就是一顿复制的,我知道有可能有些人是为了记录一下,让自己看,那你可以设置成私有的啊,干嘛要公布出来让别人浏览到啊,搞得一个博客平台乌烟瘴气,就算你没有搬抄的心里,那你最好写个转载的啊,为啥还要原创啊,原创还能过我真是服了!!!)
回到正题:
这个界别的意思是,如果当前存在事务,就加入到该事务中执行,如果当前没有事务,就和第一个一样,就新建一个事务.
听完我的解释是不是很蒙蔽?
怎么和第一个重复了,很多人说的就是这个样子,我也就这么说了,但是这里我不得不多说一句,如果是这种级别,加入到该事务中的时候,自己还是一个事务,也就是没有融合当前事务,这里会出现两个事务,那么如果出现回滚的场景: 如果外部事务回滚,因为内部事务镶嵌进来了,所以内部也会回滚,即内部因外部回滚而回滚,但反过来,如果内部先回滚,外部不会因为内部而回滚.这是和第一个有本质区别的,但你要记住,这个事务是一个子事务,不是独立的一个事务,你也可以这么理解,因为嵌套在事务内执行,所以成为了外围事务的子事务,所以外围事务是会影响子事务的.(这个特性就有点像继承关系了)
现在是不是理解第一个和第二个事务传播的区别了?
这个我特地放在第三个来说,是因为其定义好理解,但是回滚不好理解.
网上这么说:新建一个事务去执行,如果当前存在事务,把当前事务挂起,自己新建一个事务。也就是必须以自己的事务去执行.
这句话好理解吧,但是在回滚层面来说: 如果外部事务回滚,里面的事务是不受影响的,因为在这个传播行为中,里面的事务是新建的(就算它本来有事务),虽然是在里面被调用,但是却不是子事务,而是一个隔离的事务,也就是说,二者的回滚策略是互相隔离的,无论哪个回滚,都不会影响到彼此.
如果当前有事务,就加入到该事务中,成为一个事务,如果没有事务,自己也不会创建事务.
这句话不难理解,但这个事务传播行为时没用的,因为有事务加入了也变成了一个事务,这跟加不加都一样,而没有事务自己也不会创建事务,所以这个传播行为时没有意义的.
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
这个传播行为的好处是,因为是以非事务方式执行操作,所以就不存在回滚,就不存在对当前事务的回滚的影响.
必须被一个开启了事务的方法调用自己,不然就报错.
这个更狠,如果当前方法不是事务,就报错,要求当前方法一定要是事务.
这个和上一个相反,一定要以非事务的方式调用它,如果存在事务,就报异常.
文章由思创斯整理,转载请注明出处:https://ispacesoft.com/118652.html