Spring Boot(四)开启声明式事务

简介

以前用Spring想要用事务的时候,都需要自己在spring的配置文件中配置事务管理器。而Spring Boot则默认对jpa,jdbc,mybatis开启了事务,引入他们的依赖的时候,事务就开启了。使用事务只需要一个@Transactional注解就可以了。

准备

以上一篇文章【Spring Boot(三)整合MyBatis,Mybatis Generator】为例,演示事务的使用。

修改代码

在IUserService.java中添加增加员工的方法

public interface IUserService {
    User get(Integer id);
    User insert(User user) throws Exception;
}

在UserServiceImpl.java中实现该方法

@Service("iUserService")
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public User get(Integer id) {
        return userMapper.selectByPrimaryKey(id);
    }

    @Override
    @Transactional
    public User insert(User user) throws Exception{
        userMapper.insert(user);
        throw new RuntimeException();
    }
}

在Controller中添加插入用户的方法

@RestController
public class UserController {

    @Autowired
    private IUserService iUserService;

    @GetMapping("/get_user/{userId}")
    public User getUser(@PathVariable("userId") Integer userId){
        User user =iUserService.get(userId);
        return user;
    }

    @PostMapping("/add_user")
    public String addUser(User user){
        try {
            iUserService.insert(user);
            return "插入成功";
        } catch (Exception e) {
            e.printStackTrace();
            return "插入失败";
        }
    }
}

测试

这里,在UserServiceImpl的insert方法中使用了@Transactional注解开启事务。方法体中抛出一个运行时异常,所以客户端调用add_user方法时,不会插入数据到数据库。

常见问题

1、spring事务默认的事务规则是对运行时异常(RuntimeException)和程序错误(Error)才会回滚。如果针对非检测异常进行事务回滚,则可以在@Transactional中设置rollbackFor属性声明指定回滚异常:

@Override
@Transactional(rollbackFor = Exception.class)
public User insert(User user) throws Exception{
    userMapper.insert(user);
    throw new SQLException("发生了sql异常");
}

2、如果在业务层的异常被捕获了,则不会触发事务回滚。可以在异常中使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 进行手动回滚。

猜你喜欢

转载自blog.csdn.net/qq_35787138/article/details/83833357