事务控制@Transactional

自己给自己挖了个坑,做单元测试的时候,跑代码,发现预约失败异常的时候,控制台不打印错误具体信息。

,原因是重复预约,异常信息被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"); 事务生效。

猜你喜欢

转载自yhzhangdota.iteye.com/blog/2382856
今日推荐