自己给自己挖了个坑,做单元测试的时候,跑代码,发现预约失败异常的时候,控制台不打印错误具体信息。
,原因是重复预约,异常信息被throw了,没有return封装的异常对象。
@Transactional public AppointExecution appoint(long bookId, long studentId) { try { // 减库存 int update = bookDao.reduceNumber(bookId); if (update <= 0) {// 库存不足 //return new AppointExecution(bookId, AppointStateEnum.NO_NUMBER);//错误写法 throw new NoNumberException("no number"); } else { // 执行预约操作 int insert = appointmentDao.insertAppointment(bookId, studentId); if (insert <= 0) {// 重复预约 //return new AppointExecution(bookId, AppointStateEnum.REPEAT_APPOINT);//错误写法 //return new AppointExecution(bookId,AppointStateEnum.REPEAT_APPOINT); throw new RepeatAppointException("repeat appoint"); } else {// 预约成功 Appointment appointment = appointmentDao.queryByKeyWithBook(bookId, studentId); return new AppointExecution(bookId, AppointStateEnum.SUCCESS, appointment); } }...
单元测试的代码
@Test public void testInsertAppointment() throws Exception { long bookId = 1000; long studentId = 12345678910L; int insert = appointmentDao.insertAppointment(bookId, studentId); System.out.println("insert=" + insert); }
将处理的代码改了,重复预约的时候 return new AppointExecution(bookId,AppointStateEnum.REPEAT_APPOINT);
控制台成功打印出预约失败的信息 Ok.
做成页面请求预约动作时,发现一个问题,预约失败,但库存在不断减少。
表示 库存减1 动作完成,但是预约失败,库存减1动作没有回滚。
明显事务控制出了问题。
查了注解方式的事务控制,写的都唔问题。
原来处理逻辑里面,碰到重复预约的时候,return了,没有抛出异常,那么事务当然不会回滚。
导致其实是重复预约的,库存减1被commit了。
代码改回throw new RepeatAppointException("repeat appoint"); 事务生效。