简介
以前用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(); 进行手动回滚。