阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2

Requires_new

会创建一个新的事务,并且会挂起当前的事务(如果当前存在的话),
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第1张图片
先把父方法的事务去掉
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第2张图片
在子方法里面用Requires_New
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第3张图片
数据库内是没有数据的
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第4张图片
运行测试方法。这个时候报错了。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第5张图片

数据库内有一条数据
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第6张图片
相当于保存了第一个方法的数据
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第7张图片
子方法有事务,进行了自动的回滚
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第8张图片

开启父方法的事务。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第9张图片

数据库内数据清空。

运行测试,数据库内并没有数据。

 子方法进行了回滚,回滚后本身会有一个 by/zero的异常。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第10张图片
这个异常会被父方法这里拿到。拿到后就会影响saveParent的保存。它也会被回滚。 看似两个都使用了Required
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第11张图片

先把子方法的异常代码注释掉
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第12张图片

把异常的代码放在,这里。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第13张图片

saveChildren是没有异常的。但是在它的父级里面是有异常的。
运行测试。
数据库内数据。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第14张图片

事务被挂起后,不会影响它的子方法,子方法里面使用的是一个新的事务,
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第15张图片
所以saveParent会被回滚。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第16张图片

如果子方法这里,换成Required的话。父方法也用required。如果当前的调用方带事务的话,子方法会加入到这个事务里面。也就是两个方法共用一个事务。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第17张图片

运行测试。数据库没有值。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第18张图片

这是因为我们这两个方法共用了一个事务。异常不管在哪个方法里面抛出,都会回滚。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第19张图片

requires_new回滚

阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第20张图片

NotSupports和Never

当我们要去运行一个方法的时候,以一种没有事务的形式去运行,如果它当前存在一个事务的话,它就会挂起。也就是说不管我当前有没有事务,我自己特立独行, 我仅仅使用一个没有事务的形式去执行我相应的语句。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第21张图片

代码演示

父方法的事务先注释掉
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第22张图片
子方法内,使用Not_supports然后,异常的代码开启。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第23张图片
现在父方法没有事务,子方法是not_supports,也就是子方法不使用事务,
运行事务,
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第24张图片

数据库内数据
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第25张图片
虽然抛出了异常,但是没有回滚。

开启父方法事务

阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第26张图片

再来运行测试。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第27张图片
也就是saveChild1保存了数据。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第28张图片
虽然子方法抛出了异常,但是父方法有事务回滚。自己的saveParent方法被回滚。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第29张图片

not_siuppots 总结

Never

没有事务的形式去执行,一旦发现调用方有事务存在,它会抛出一个异常。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第30张图片

如果我们在子方法内使用Never
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第31张图片
父方法使用了Required
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第32张图片

运行测试类。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第33张图片

抛出的异常。找到一个存在的事物, 用了Never调用方不允许使用事物。



父方法的事务注释掉。
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第34张图片
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第35张图片
这个时候就会抛出我们自己代码的异常
阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第36张图片

阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2_第37张图片

never总结

结束



 

你可能感兴趣的:(阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2)