方法 A 中调用 B 后再调用 C, 三个方法中均有插入数据后再查询数据

B 方法的注解:@Transactional (propagation=Propagation.REQUIRES_NEW) -- 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

C 方法的注解:@Transactional (propagation=Propagation.REQUIRED) -- 如果有事务,那么加入事务,没有的话新建一个

1、当方法 B 或者 C 报错时,A、B、C 方法都回滚

2、当方法 A、B、C 异常被捕获时,A、B、C 事务不回滚(a、b、c 均入库)

3、当方法 BC 执行后,方法 A 报错时,A、C 事务回滚,B 事务不回滚(b 数据入库)

A 方法向表中添加数据 a,在查询该表能得到数据 a

B 方法向表中添加数据 b,再查询该表能得到数据 b

C 方法向表中添加数据 c,再查询该表能得到数据 a,b,c

带有注解 @Transactional (propagation=Propagation.REQUIRES_NEW) 的方法走完之后,数据就会被提交入库

另外需要注意方法内部调用 @Transactional (propagation=Propagation.REQUIRES_NEW) 注解不生效,比如 A 和 B 都在同一个方法中,A 调用 B,B 方法是此注解,则不生效。同样,AOP 拦截也拦截不到 B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}
}

七种事物传播类型 默认为: REQUIRED

阅读次数

请我喝[茶]~( ̄▽ ̄)~*

有李说不清 微信支付

微信支付

有李说不清 支付宝

支付宝

有李说不清 贝宝

贝宝