一、事务的传播性
只要和数据库交互,一定会使用到事务,那么事务的传播性有哪几类。
事务种类(源码)
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
private final int value;
private Propagation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
二、事务传播性的大类
1、REQUIRED 默认事务
直接使用注解@Transactional,默认的就是REQUIRED,也可以不声明,可以使用在增删改。
如果在一个方法A中调用了两个方法,如果使用REQUIRED,就意味着整体创建了一个事务。如果子方法开启了一个事务,默认会加入到A的事务中形成一个事务整体
2、SUPPORTS
如果当前有事务,则使用事务,如果没有事务则不启用事务。 如A掉用BC两个方法,A上面没有事务,则BC上增加SUPPORTS ,则数据不会回滚。如果A上有事务,
则BC事务生效,如果出现异常,数据会回滚。
3、MANDATORY
MANDATORY强制性的,如果A调用BC,BC使用了MANDATORY,然后A上面没有配置事务,则运行则会抛出异常。如果A使用了事务,调用BC,则正常使用。
4、REQUIRES_NEW
创建一个新事务,并挂起当前事务,出现两个事务。 例如 A方法调用BC方法,B上面有REQUIRES_NEW事务标识,C没有。执行后,B中如果有异常,B中的数据会回滚,C正常执行完成。
如果A使用REQUIRED事务,如果BC有REQUIRES_NEW则新开启一个事务,如果没有就REQUIRED
5、NOT_SUPPORTED
不使用事务。例如A方法调用BC方法。 如果A方法有事务REQUIRED,B方法有事务NOT_SUPPORTED,如果出现异常C方法数据会回滚,B方法则不会回滚。
6、NEVER
不允许有事务,例如A调用BC,A使用了事务,BC使用了NEVER,则会抛出非法事务的异常。
7、NESTED
嵌套事务,如果当前有事务,就创建子事务。例如A方法调用BC方法,如果A使用REQUIRED,BC中使用NESTED事务,A中发生异常时,事务会被回滚。如果A没有事务,A发生异常时,事务不会回滚。
如果时B发生异常时,如果不捕获,主事务也会回滚。如果主事务提交,子事务会一并提交。
以上内容如果有不完整的,大神们勿喷,请指教。