关注我,每天三分钟,带你轻松掌握一个Java相关知识点。
事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
换言之,一个带事务的方法调用了另一个带事务的方法,被调用的方法它怎么处理自己事务和调用方法事务之间的关系。
spring给出了7种解决方案,我们可以通过指定某种方案来解决不同的问题。(以下都是以被调用方法来说的)
传播特性的枚举类
propagation_requierd:如果被调用的时候,调用我的方法没有事务,就给自己新建一个事务,如果调用我的方法已存在一个事务了,那么我就加入到这个事务中,这个是默认选项,也是最常见的。
bbb回去看aaa有没有事务,如果有就加入到aaa的事务中,即如果aaa中出现异常,那么aaa和bbb都回滚。
这个属性就是要求我当前方法至少处于一个事务当中。
propagation_supports:支持调用方法事务,如果调用方法没有事务,我就以非事务方法执行。
aaa有事务,bbb就跟着aaa回滚,aaa没有事务,那么bbb中出现异常了我也不回滚。
这个属性是如果你有我就加入你,如果你没有我也不强求。
propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
aaa如果没有事务,到bbb的时候直接抛出异常。
这个属性要求你要调用我,就必须有事务。
propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
bbb看aaa有事务,就把aaa的事务挂起,aaa事务就先不管用了,bbb自己新搞一个事务,自己提交或者回滚完,aaa事务才起作用。
propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
bbb自己不走事务,如果aaa有事务,那就把aaa的事务暂时置为无效,等bbb执行完再放回来。
propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
bbb自己不走事务,而且调用bbb的方法也不能有事务,否则抛异常。
propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
这里涉及到嵌套事务的概念了,嵌套事务是一个外部事务的一个子事务,是一个外部事务的一个组成部分,当嵌套事务发生异常,而回滚,则会恢复到嵌套事务的执行前的状态,相当于嵌套事务未执行。如果外部事务回滚,则嵌套事务也会回滚;外部事务提交的时候,它才会被提交。
propagation_required_new和 propagation_nested的最大区别在于, propagation_required_new完全是一个新的事务, 而 propagation_nested则是外部事务的子事务, 如果外部事务 commit, 嵌套事务也会被 commit, 这个规则同样适用于 roll back.。
到此为止,我们把事务这块主要属性基本讲解完了,下一期我会就@Transactional以及前面几期讲的事务属性做一个总结,让大家对事务有个整体的认知。
以上就是今天的知识点,各位小伙伴get到吗?创作不易,望各位多多点赞收藏,有什么建议可以留言告诉我,我会积极采纳!