@Transactional没有回滚

时间:2016-09-10 03:45:39

标签: java spring-mvc transactional

我整天都在浪费时间试图找出为什么我的DML语句没有被回滚。虽然我已经在互联网上以及在stackoverflow上进行了彻底的搜索 - 但我无法绕过它。

我不是试图通过try catch或@ExceptionHandler或@ControllerAdvice捕获以下异常。无法弄清楚为什么我的查询没有被回滚。这个问题听起来像是重复的,但stackoverflow上的其他帖子都没有解决我的问题

spring.xml

<bean id="employeeImpl" class="org.daoImpl.EmployeeImpl">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

控制器

@RequestMapping(value = "/formSubmit", method = RequestMethod.POST)
public ModelAndView handleForm(@ModelAttribute("employee") Employee employee) {

    ModelAndView modelAndView = new ModelAndView("Success");
    employeeImpl.insertEmployee(employee);
    return modelAndView;
}

最后需要回滚的方法

@Transactional(rollbackFor=RuntimeException.class)
public void insertEmployee(Employee emp) {
    String SQL = "insert into employee values(?,?,?,?,?)";
    getJdbcTemplate().update(SQL, new Object[] { emp.getId(),emp.getFname());
    throw new RuntimeException("I am throwing you out!");
}

我使用MySQL作为我的数据库。

即使抛出运行时异常,插入查询仍然存在于数据库中,它应该回滚到右边吗?有人可以告诉我我错过了什么

1 个答案:

答案 0 :(得分:0)

由于桌子的引擎是MyISAM,因此交易没有回滚。这个特殊的引擎不会支持TJ正确指出的交易(我不知道!)

我已将表格的引擎更改为InnoDB,并且事务正按预期回滚。

再次感谢TJ!