项目结构:
1.serviceImpl 对象服务类
2.exception 自定义异常类
实现原理:
1.在一个serviceImpl的实现方法中,复杂事务的处理时,如果事务中仅有部分完成,那么就不能执行整个方法,需要执行回滚。下面是一个示例:StudentServiceImpl中的一个实现方法
@Transactional
@Override
// @Transactional 和 事务 和 发生异常回滚 有联系
public void addStudentAndScore(StudentServiceParam param) {
try{
// 添加学生
Student student = new Student(param.getSno(),param.getSname(),param.getSage(),
param.getSsex());
studentMapper.insert(student);
// 添加课程
Course course = new Course(param.getCno(),param.getCname(),param.getTno());
courseMapper.insert(course);
// 添加SC
courseMapper.insertSc(param.getSno(),param.getCno(),param.getScore());
}catch (Exception e){
// 打印日志信息等
// 打印异常堆栈信息
e.printStackTrace();
// 抛出自定义的异常
throw new TjEtcException(e,10246,"保存课程和学生成绩失败");
}
}
方法中当添加课程失败时,添加sc就不会成功,进而整个事务不能被完成,因此需要事务回滚。
*运行时异常抛出,事务发生回滚
这里我们try catch打印并抛出了一个自定义异常类 TjEtcException,来满足事务需求,下文会提到
2.所以我们要写自定义业务异常 TjEtcException类继承RuntimeException,类中可以自定义针对事务的异常属性,并写出继承RuntimeException的构造方法
@Data
public class TjEtcException extends RuntimeException{
private int errorCode;
private String eorrorMsg;
/**
* 构造方法
*
* @param cause 异常对象
* @param errorCode 异常错误码
* @param eorrorMsg 错误信息
*/
public TjEtcException(Throwable cause,int errorCode, String eorrorMsg) {
super(cause);
this.errorCode = errorCode;
this.eorrorMsg = eorrorMsg;
}
}
3.通过这种自定义异常类的方式,我们可以明确异常发生的类型,区分异常Exception是否为业务引起的。