同一个类中@Transactional 事务失效问题
1.在同一个类中一个在 a 的方法调用另外一个 b和c的方法,那么b方法和c方法的事务设置会失效。
原因:直接调用同一个类中的方法相当于跳过了代理对象,直接把代码复制到a方法里。
事务是通过代理对象来控制的
public class Test {
@Transactional
public void a() {
//b,c做任何设置都没用,都是和a公用一个事务
b();
c();
}
@Transactional
public void b() {
/* … */
}
@Transactional
public void c() {
/* … */
}
}
2.在同一个类中如何实现方法互调事务同时生效的解决。
1.引入pom,使用aspectj做为动态代理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.在启动类开启动态代理
//开启aspectj动态代理功能,以后所有的动态代理功能都是由aspectj创建的(即使没有接口也能创建动态代理)
@EnableAspectJAutoProxy(exposeProxy = true)
3.本类可以互相调用对象,完成事务
public class Test {
@Transactional
public void a() {
Test service = (Test) AopContext.currentProxy();
service.b();
service.c();
}
@Transactional
public void b() {
/* … */
}
@Transactional
public void c() {
/* … */
}
}