阶段一-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总结

结束



 

猜你喜欢

转载自www.cnblogs.com/wangjunwei/p/12051178.html