目录
1.1 REQUIRED
(默认的传播属性值)
如果当前已经存在事务,那么加入该事务,如果不存在事务,创建一个事务
1.2 SUPPORTS
当前线程存在事务,挂起当前事务,执行完后,恢复挂起的事务(可以认为无事务执行,sql的提交完全依赖于 defaultAutoCommit属性值)
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
A.a();
@Transaction(propagation=Propagation.SUPPORTS, rollbackFor = Exception.class)
B.b(){
do sql 1;
1/0;
do sql 2;
};
}
}
由于all() 开启事物,B.b()执行的时候开启是一个空事物(执行的时候没有事务)
这个时候,sql 1 是否回滚,取决于是否开启了自动提交功能
1.3 MANDATORY
当前必须存在一个事务,否则抛出异常
1.4 REQUIRES_NEW
事务不存在创建一个新的,事务存在则创建一个子事务(子事务发生异常回滚 导致 主事务回滚)
情况i:
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
@Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
A.a();
B.b();
1/0;
}
}
A.a() 是子事务,子事务发生异常,能够正常回滚
当代码执行到第7行的时候,会出现导致B.b()回滚,A.a()不会发生回滚
情况ii:
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
A.a();
@Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
B.b();
}
}
B.b() 是子事务,子事物发生异常,B.b()执行的内容能够正常的回滚
all() 主事务也能够正常的回滚
情况iii:
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
A.a();
try {
@Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
B.b();
} catch{
}
}
}
B.b() 是子事务,子事物发生异常,B.b()执行的内容能够正常的回滚
由于B.b() 的异常被手动捕获处理了,all() 主事务不受影响
1.5 NOT_SUPPORTED
如果当前存在事务,挂起当前事务,然后新的方法在没有事务的环境中执行,没有spring事务的环境下,sql的提交完全依赖于 defaultAutoCommit属性值(是否自动提交)
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
A.a();
@Transaction(propagation=Propagation.NOT_SUPPORTED)
B.b(){
do sql 1;
1/0;
do sql 2;
};
}
}
B.b() 执行的时候不参与到主事务中(这个时候sql 1 是否提交取决于是否开启自动提交配置),
主事务是否会滚取决于是否有异常抛出,因为B.b() 的异常没有进行捕获,所以A.a() 执行的内容会回滚
1.6 NEVER
如果当前存在事务,则抛出异常,否则在无事务环境上执行代码
1.7 NESTED
all()是嵌套事物, A.a()是子事务(实际效果和默认的事物传播机制一样)
嵌套事务呈现父子事务概念,二者之间是有关联的,核心思想就是子事务不会独立提交,而是取决于父事务,当父事务提交,那么子事务才会随之提交;如果父事务回滚,那么子事务也回滚
情况i:
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
@Transaction(propagation=Propagation.REQUIRES_NESTED, rollbackFor = Exception.class)
A.a(){
do sql 1;
1/0;
do sql 2;
};
B.b();
}
}
A.a() 子事务发生异常,A.a()发生回滚,all()外部大事物是否回滚取决于是否对A.a() 进行捕获
情况ii:
class ALL {
@Transaction(rollbackFor = Exception.class)
all() {
@Transaction(propagation=Propagation.REQUIRES_NESTED, rollbackFor = Exception.class)
A.a();
B.b();
1/0;
}
}
外部事务抛出了异常,整个大事务都会回滚