@Transactional
@RestController
public class TransactionalTest {
@Autowired
JObLevelMapper jObLevelMapper;
@GetMapping("/test1")
public void test1() {
JObLevel jObLevel1 = new JObLevel();
jObLevel1.setName("test1");
jObLevelMapper.insertSelective(jObLevel1);
this.test2();
}
public void test2() {
JObLevel jObLevel2 = new JObLevel();
jObLevel2.setName("test2");
jObLevelMapper.insertSelective(jObLevel2);
JObLevel jObLevel3 = new JObLevel();
jObLevel2.setName("test3");
int i = 1/0;
jObLevelMapper.insertSelective(jObLevel3);
}
}
异常回滚正常
@RestController
public class TransactionalTest {
@Autowired
JObLevelMapper jObLevelMapper;
@Transactional
@GetMapping("/test1")
public void test1() {
JObLevel jObLevel1 = new JObLevel();
jObLevel1.setName("test1");
jObLevelMapper.insertSelective(jObLevel1);
this.test2();
}
public void test2() {
JObLevel jObLevel2 = new JObLevel();
jObLevel2.setName("test2");
jObLevelMapper.insertSelective(jObLevel2);
JObLevel jObLevel3 = new JObLevel();
jObLevel2.setName("test3");
int i = 1/0;
jObLevelMapper.insertSelective(jObLevel3);
}
}
异常回滚正常
@RestController
public class TransactionalTest {
@Autowired
JObLevelMapper jObLevelMapper;
@GetMapping("/test1")
public void test1() {
JObLevel jObLevel1 = new JObLevel();
jObLevel1.setName("test1");
jObLevelMapper.insertSelective(jObLevel1);
this.test2();
}
@Transactional
public void test2() {
JObLevel jObLevel2 = new JObLevel();
jObLevel2.setName("test2");
jObLevelMapper.insertSelective(jObLevel2);
JObLevel jObLevel3 = new JObLevel();
jObLevel2.setName("test3");
int i = 1/0;
jObLevelMapper.insertSelective(jObLevel3);
}
}
异常回滚不正常
总结:
同一个类中方法调用会可能导致@Transactional失效
同类中方法test1调用方法test2,test1没有声明注解事务,而test2方法有。则外部调用test1之后,方法test2的事务是不会起作用的。
解决方案:
强制使用AspectJ对方法进行切面
pom.xml 中添加AspectJ:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
启动类上添加 @EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication
@MapperScan(basePackages = "org.tsq.mvhr.mapper")
@EnableAspectJAutoProxy(exposeProxy = true)
public class MvhrApplication {
public static void main(String[] args) {
SpringApplication.run(MvhrApplication.class, args);
}
}
注意: exposeProxy = true 若不添加会报错:
java.lang.IllegalStateException:
Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available,
and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.
修改代码:
@RestController
public class TransactionalTest {
@Autowired
JObLevelMapper jObLevelMapper;
@GetMapping("/test1")
public void test1() {
JObLevel jObLevel1 = new JObLevel();
jObLevel1.setName("test1");
jObLevelMapper.insertSelective(jObLevel1);
// this.test2();
((TransactionalTest)AopContext.currentProxy()).test2();
}
@Transactional
public void test2() {
JObLevel jObLevel2 = new JObLevel();
jObLevel2.setName("test2");
jObLevelMapper.insertSelective(jObLevel2);
JObLevel jObLevel3 = new JObLevel();
jObLevel2.setName("test3");
int i = 1/0;
jObLevelMapper.insertSelective(jObLevel3);
}
}
异常回滚正常