我们知道对于spring项目一般都是在service层进行事务注解的。事务注解:“@Transactional”。
不捕获异常情况
当你不用捕获异常时,可以直接在类或方法上添加事务注解,它两的区别在于在类上添加注解会对service中的所有方法进行回滚,而在方法上添加注解,只会在改方法上进行回滚。@Transactional//看这里
public void demo() {
this.userRepository.save(new User(USERNAME));
}
捕获异常情况
当你需要捕获异常时,如果还是只添加了注解“@Transactional”,你只会捕获异常而不会对数据库回滚。解决方法有以下两种:- 给注解添加属性rollbackFor=Exception.class,这是因为spring框架只会对抛出RuntimeException或其子类例的实例时才会回滚,其他的异常是不会回滚的
@Transactional(rollbackFor = Exception.class)//看这里
public void demo() throws Exception {
this.userRepository.save(new User(USERNAME));
throw new Exception("No Rollback");
}
- 使用 TransactionStatus.setRollbackOnly()手动触发回滚,即在你所需要回滚的方法中添加:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@Transactional
public void demo() {
this.userRepository.save(new User(USERNAME));
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//看这里
}