Spring事务传播机制想必大家都知道,网上很多,这里不再赘述,今天来讨论一下PROPAGATION_REQUIRED,深入理解一下这个属性的含义。
首先,我们讨论的是Spring事务传播机制中的PROPAGATION_REQUIRED,这个是默认配置,支持当前事务,如果当前没有事务,则新建一个事务。怎么理解这句话?首先明确一点,支持当前事务,指的是支持当前线程的事务。网上对PROPAGATION_REQUIRED的说明,有点含糊,这个当前线程的限制范围要搞清楚,因为嵌套事务最终都是属于线程的。
假如我们有2个service,serviceA和serviceB,事务传播机制属性为PROPAGATION_REQUIRED,非readOnly,如果serviceA去调用serviceB中的方法,考虑下面的场景。
第一点:如果serviceA没有事务,serviceB有事务,serviceB拋异常,则serviceB回滚,serviceA不回滚。为什么呢,因为当前没有事务,则新建一个事务。新建的事务不受serviceB的影响。新建的事务和serviceB的事务相互独立。
第二点:如果serviceA有事务,serviceB有事务,serviceB拋异常,则serviceB回滚,serviceA回滚。为什么呢,因为当前有事务,则支持当前事务。serviceA的事务和serviceB的事务建立了联系,不是相互独立的。