谈一下Spring事务传播机制?
传播特性有几种? 七种。
Required,Requires_new,nested,Support,Not_Support,Never,Mandatory
某一个事务嵌套另一个事务的时候怎么办?
A方法调用B方法,AB方法都有事务,并且传播特性不同,那么如果A有异常,B怎么办?如果B有异常,A怎么办?
总:事务的传播特性是指不同方法的嵌套调用过程中,事务应该如何进行处理,是用同一个事务还是不同的事务,当出现异常的时候是会回滚还是提交,两个方法之间的相互影响,在日常工作中,使用比较多的是required,required_new,nested
分:
1、先说事务的不同分类,可以分为三大类:支持当前事务,不支持当前事务,嵌套事务
支持当前事务:
Required——默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务。
Supports——当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行。
Mandatory——当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行。
不支持当前事务:
Required New——创建一个新事务,如果存在当前事务,则挂起该事务。
Not Supported——以非事务的方式执行,如果存在当前事务,则挂起当前事务。
Never——不使用事务,如果当前事务存在,则抛出异常。
嵌套事务:
Nested——如果当前事务存在,则在嵌套事务中执行,否则新建一个事务。
Required_new和Nested的区别:
Required_new是新建一个事务并且新开始的这个事务与原有事务无关,而Nested则是当前存在事务时会开启一个嵌套事务,在Nested情况下,父事务回滚时,子事务也会回滚,而Required_new情况下,原有事务回滚,不会影响新开启的事务。
Nested和Required的区别:
Required情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在Nested情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。