现象

方法上加了 @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 自动配置。

未开启事务管理,注解不会生效。