场景还原(Transaction是由aop实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Component
public class AopTest{

@Transaction
public void methodA(){
methodB();
}

@Transaction
public void methodB(){
methodC();
}

@Transaction
public void methodC(){

}
}

@RestController
public class Controller{
@Autowired
private AopTest aop;

public void test(){
aop.methodA();
}
}

    请求进来,到Controller.test(),该方法调用AopTest.methodA()。此时只有methodA的事务会生效

原因分析

    aop实现的方式是生成一个动态的代理对象去调用aop方法。
    因为@Transaction是由aop实现的,aop的方法,会生成一个代理对象去调用,Controller注入的AopTest对象是一个代理对象,在controller调用methodA会按照aop的过程执行,所以methodA的事务会生效。但是在mthodA中调用methodB,是由当前对象直接调用,所有methodB的事务不会生效。

解决办法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Component
public class AopTest{

@Transaction
public void methodA(){
//通过代理对象去调用sendMessage()方法
(AopTest)AopContext.currentProxy().methodB();
}

@Transaction
public void methodB(){
(AopTest)AopContext.currentProxy().methodC();
}

@Transaction
public void methodC(){

}
}