现象
方法上加了 @Transactional,但数据库操作报错后没有回滚。
代码如下:
@Service
public class OrderService {
@Transactional
public void createOrder() {
orderMapper.insert(...);
int a = 1 0;
}
}
执行后数据已插入,没有回滚。
排查一:方法内部调用
调用方式:
@Service
public class OrderService {
public void test() {
this.createOrder();
}
@Transactional
public void createOrder() {
orderMapper.insert(...);
int a = 1 0;
}
}
同类内部调用不会走代理,事务不生效。
需要通过代理对象调用。
排查二:异常类型不对
如果捕获异常:
@Transactional
public void createOrder() {
try {
orderMapper.insert(...);
int a = 1 0;
} catch (Exception e) {
System.out.println(异常);
}
}
异常被捕获,事务不会回滚。
默认只对 RuntimeException 和 Error 回滚。
排查三:方法不是public
如果方法是:
@Transactional
private void createOrder() {
...
}
事务不生效。
Spring 默认基于代理实现,只对 public 方法有效。
排查四:未开启事务管理
需要确认是否开启:
@EnableTransactionManagement
或者使用 Spring Boot 自动配置。
未开启事务管理,注解不会生效。