我有一个Spring @Service
bean,其中一些数据保存在 MySQL 中。它保存LocalDateTime
个对象,用于将来日期的预订房间。
问题是:当一次预订多个房间并且其中一个房间不可用(即已经预订)时,Spring应该回滚已经预订的所有房间,但是没有这样做。除了错误之外的所有内容都会被提交到数据库。
我的@Service
内的代码,在抛出异常后应该回滚的代码。
@Transactional(rollbackFor = { RecurrentMeetingBookingException.class})
public void bookRecurringMeeting(RecurrentMeeting meeting) throws RecurrentMeetingBookingException {
LocalDateTime start = meeting.getMeetingEntity().getStartDate();
LocalDateTime end = meeting.getMeetingEntity().getEndDate();
while (start.isBefore(meeting.getRecurrenceEndTime())) {
MeetingEntity recurrent = copyOfRecurrent(meeting, start, end);
try {
bookRoomForDate(recurrent);
} catch (MeetingException e) {
throw new RecurrentMeetingBookingException(e.getMessage());
}
start = start.plus(1, meeting.getRecurrenceType().getUnitOfTime());
end = end.plus(1, meeting.getRecurrenceType().getUnitOfTime());
}
}
我也试过抛出一个RuntimeException
,但它也没有用。
从我的ResponseEntity
返回Controller
时,确实会抛出异常,因为我将Room is not available
作为异常返回,并返回它的消息。
我的@Transactional
有什么问题?抛出异常时,Spring / Hibernate不应回滚所有内容吗?我该怎么做才能解决这个问题,并正确回滚@Transactional
?
答案 0 :(得分:0)
当遇到这个问题时,a member from the spring forums came with a solution,早在2011年。
确保您使用的是交易表格,例如 INNODB
您可能正在使用非交易表格,例如 MyISAM ,而@Transactional
将无法正常使用。
这不是Spring / Hibernate问题,而是数据库的问题。