概念理解
事务传播机制,字面理解,第一说明事务是可以传播的,第二事务传播就至少需要两个对象;更进一步理解,需要回答两个问题,一是传播是谁传播给谁?二是传播对事务有何影响?下面就试着回答这两个问题。
谁传播给谁?
所谓事务传播,个人理解就是指在有事务嵌套的情况下,当前进行的“事务“和外部“事务“的互相影响。这样来看,就是当前进行的“事务”会影响外部“事务”,即当前进行的事务传播给了外部“事务”;反过来,外部“事务”也会影响当前进行的“事务”,即外部“事务”传播给了当前进行的“事务”。
事务嵌套具体的说就是指方法A调用方法B。这时我们就说,方法A就是外部事务,方法B就是当前进行的事务。
在执行方法B时,它的执行是否加入外部事务,是否在独立的事务中运行,主要是看方法B设置的事务传播方式,但也需要参照外部事务方法A来决定,所谓参照,就是需要看方法A是否存在事务。
在执行方法A时,它的事务执行,一方面主要是看方法A设置的事务传播机制,另一方面也会受方法B事务机制的设置和执行情况的影响。
传播对事务有何影响?
机制名称 | 最终事务 个数 | 方法A(外部事务)所受影响 | 方法B(当前事务) |
---|---|---|---|
PROPAGATION_REQUIRED | 1个 | 共同失败或成功 | 如果外部没有事务,就新建一个事务,否则就加入外部事务 |
PROPAGATION_REQUIRED_NEW | 1个或2个 | 被挂起 | 始终会创建一个新事务 |
PROPAGATION_NEVER | 0个 | 必须不存在事务 | 必须在无事务的状态中执行,如果事务存在,则抛出异常 |
PROPAGATION_MANDATORY | 1个 | 必须存在事务 | 必须在事务中下执行,如果事务不存在,则抛出异常 |
PROPAGATION_SUPPORTS | 0个或1个 | 无影响 | 有没有事务都可以;有则在事务中执行,没有则在无事务状态中执行 |
PROPAGATION_NOT_SUPPORTS | 0个或1个 | 如果有外部事务,则被挂起 | 在无事务状态下执行 |
PROPAGATION_NEST | 1个或2个 | 内部事务的回滚不影响外部事务的提交 | 在嵌套事务中运行,如果外部不存在事务,则创建一个事务 |