Spring @Transactional在失败后没有回滚

时间:2017-08-04 14:46:30

标签: java mysql spring hibernate transactions

我有一个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

1 个答案:

答案 0 :(得分:0)

当遇到这个问题时,a member from the spring forums came with a solution,早在2011年。

确保您使用的是交易表格,例如 INNODB

您可能正在使用非交易表格,例如 MyISAM ,而@Transactional将无法正常使用。

这不是Spring / Hibernate问题,而是数据库的问题。