spring boot 声明式事务,在什么情况下会失效

基于spring boot来验证事务在什么情况下会失效

首先要明确spring的事务是基于动态代理来实现的

1.如果声明事务的方法不是public,那么事务会失效

2.当一个没有事务的方法,调用一个有事务的方法时,会让事务失效

例如以下代码

如果直接调用service层的save方法,那么事务会生效,因为service层使用声明了事务注解,

但是如果通过service层的没有事务的add方法,来调用有事务的save方法,那么此时就是通过this来调用的,将不会产生代理对象,所以事务就不会生效,user插入成功后,虽然显式的抛出异常,那么插入成功的数据也不会回滚;

在这种情况下,如果想要使add的方法添加事务,在其方法上声明事务注解即可

public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;

    @Override
    @Transactional
    public int save(User user) {
        int total = userMapper.insert(user);
        if (total == 1) {
            throw new RuntimeException("rollback");
        }
        return total;
    }

    @Override
    public int add(User user) {
        return save(user);
    }
}

 

你可能感兴趣的:(spring相关)