同一个对象内事务方法互调默认失效,原因是绕过了代理对象,事务使用代理对象来控制的
解决:使用代理对象来调用事务方法
1)、引入aop-starter(因为此依赖引入了aspectj依赖)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2)、@EnableAspectJAutoProxy(exposeProxy = true)
//开启aspectj动态代理功能。以后所有的动态代理都是aspectj创建的(即使没有接口也可以创建动态代理,对外暴露代理对象)。注:jdk动态代理必须有接口
3)、AopContext.currentProxy()
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.aop.framework.AopContext;
@SpringBootTest
class MallOrderApplicationTests {
@Transactional(timeout = 30)
public void a(){
//b,c做任何设置都没用。都是和a公用一个事务
// this.b();
// this.c();
//如果a,b不在同一个类里
// bService.b();//a事务
// aService.a();//新事物(不会滚)
//但此时a,b都在同一个类里,我们可以用aop-starter依赖
MallOrderApplicationTests test=(MallOrderApplicationTests)AopContext.currentProxy();
test.b();
test.c();
int i=10/0;
}
@Transactional(propagation = Propagation.REQUIRED,timeout = 10)
public void b(){}
@Transactional(propagation = Propagation.REQUIRES_NEW,timeout = 20)
public void c(){}