前面我们已经配置好了JPA,那么为了保证数据的一致性,我们就要用到事务控制。
在springboot上使用事务其实很简单,就一个注解@Transactional,那么就来试试吧
首先写个方法
@RequestMapping("/save")
@Transactional
public void save(String name,Integer age) {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new NullPointerException();
}
接着去postman执行一下
去数据库看下有没有新增数据
image.png
没有新增数据说明事务回滚。我们也可以在类上直接添加注解,那么所有的方法都进行事务的管理。
其中Spring的默认的事务规则是遇到运行异常(RuntimeException及其子类)和程序错误(Error)才会进行事务回滚,当我们遇到SQLException(检测异常)时事务不回滚
@RequestMapping("/save")
@Transactional
public void save(String name,Integer age) throws SQLException {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new SQLException("发生异常了!!!");
}
image.png
image.png
数据添加了,说明事务没有回滚,那么我们可以使用rollbackOn属性,表示当该方法中抛出指定的异常时数据回滚
@RequestMapping("/save")
@Transactional(rollbackOn = Exception.class)
public void save(String name,Integer age) throws SQLException {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new SQLException("发生异常了!!!");
}
执行一下
image.png
image.png
数据没有增加,说明回滚了
注解还有个属性叫dontRollbackOn,表示当该方法中抛出指定的异常时数据不回滚
还有在业务层捕捉异常后,发现事务不生效。例如
@RequestMapping("/save")
@Transactional(rollbackOn = Exception.class)
public void save(String name,Integer age){
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
try {
throw new SQLException("发生异常了!!!");
} catch (Exception e){
e.printStackTrace();
}
}
执行一下
image.png
事务没有回滚,我们把异常统一抛出,例如
@RequestMapping("/save")
@Transactional(rollbackOn = Exception.class)
public void save(String name,Integer age) throws Exception {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new SQLException("发生异常了!!!");
}
这样事务就回滚了
参考资料:https://blog.csdn.net/cowbin2012/article/details/90751044
其中这里rollbackFor 属性没有了,改成了rollbackOn
网友评论