事物的传播行为有七种,不仅要知道这七种分别是什么意思,还要知道分别适合哪种场景使用。
在service1
中调用了service2
方法,则service2
可以定义以下不同事物传播行为
- PROPAGATION_REQUIRED
解释:如果当前存在事物,则加入该事物;如果不存在事物,则创建一个新的事物。该行为一般被设置为默认
场景:service2
要至少保证在一个事物中运行 - PROPAGATION_SUPPORTS
解释:如果当前存在事物,则加入该事物;如果不存在事物,则直接执行
场景:适合查询方法。这种行为中如果service1
启动了一个事物,service2
能够加入到这个事物中去,从而能够读取service1
当前修改的数据,否则会由于事物未提交无法读取service1
修改的数据(隔离级别大于未提交读) - PROPAGATION_MANDATORY
解释:强制要求当前存在一个事物,如果不存在则抛出异常
场景:service2
需要事物支持但自身又不管理食物提交或回滚,即强制要求前面的方法创建并管理一个事物给它用 - PROPAGATION_REQUIRES_NEW
解释:不管当前是否存在事物,必定创建一个新事物,如果当前存在事物这个事物会被挂起。新事物在层级上与之前的事物是平级的,两者互不干扰
场景:如service2事物的失败不想影响到service1
事物的成功提交,可以使用这个行为 - PROPAGATION_NOT_SUPPORTED
解释:不支持当前事务,若存在则挂起(能不能挂起还得看对应的事务管理器是否支持挂起事物)
场景:略 - PROPAGATION_NEVER
解释:永远不使用事物,如果存在事物,抛出异常
场景:略 - PROPAGATION_NESTED
解释:如果不存在事物,则创建一个新的;如果存在事物,则在当前事务的一个嵌套事物中执行,嵌套事物的层级关系是外层事物的子事物,子事物执行的时候,外层事物不会被挂起,且子事物与外层事物共有事物状态(没有隔离)
场景:将一个大事物分解为多个小事物执行,根据小事物的执行状态决定大事物的执行流程