阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-25 详解事务的传播-2
Requires_new
会创建一个新的事务,并且会挂起当前的事务(如果当前存在的话),
先把父方法的事务去掉
在子方法里面用Requires_New
数据库内是没有数据的
运行测试方法。这个时候报错了。
数据库内有一条数据
相当于保存了第一个方法的数据
子方法有事务,进行了自动的回滚
开启父方法的事务。
数据库内数据清空。
运行测试,数据库内并没有数据。
子方法进行了回滚,回滚后本身会有一个 by/zero的异常。
这个异常会被父方法这里拿到。拿到后就会影响saveParent的保存。它也会被回滚。 看似两个都使用了Required
先把子方法的异常代码注释掉
把异常的代码放在,这里。
saveChildren是没有异常的。但是在它的父级里面是有异常的。
运行测试。
数据库内数据。
事务被挂起后,不会影响它的子方法,子方法里面使用的是一个新的事务,
所以saveParent会被回滚。
如果子方法这里,换成Required的话。父方法也用required。如果当前的调用方带事务的话,子方法会加入到这个事务里面。也就是两个方法共用一个事务。
运行测试。数据库没有值。
这是因为我们这两个方法共用了一个事务。异常不管在哪个方法里面抛出,都会回滚。
requires_new回滚
NotSupports和Never
当我们要去运行一个方法的时候,以一种没有事务的形式去运行,如果它当前存在一个事务的话,它就会挂起。也就是说不管我当前有没有事务,我自己特立独行, 我仅仅使用一个没有事务的形式去执行我相应的语句。
代码演示
父方法的事务先注释掉
子方法内,使用Not_supports然后,异常的代码开启。
现在父方法没有事务,子方法是not_supports,也就是子方法不使用事务,
运行事务,
数据库内数据
虽然抛出了异常,但是没有回滚。
开启父方法事务
再来运行测试。
也就是saveChild1保存了数据。
虽然子方法抛出了异常,但是父方法有事务回滚。自己的saveParent方法被回滚。
not_siuppots 总结
Never
没有事务的形式去执行,一旦发现调用方有事务存在,它会抛出一个异常。
如果我们在子方法内使用Never
父方法使用了Required
运行测试类。
抛出的异常。找到一个存在的事物, 用了Never调用方不允许使用事物。
父方法的事务注释掉。
这个时候就会抛出我们自己代码的异常
never总结
结束