@Transactional 不回滚
@Transactional not rolling back
我真的浪费了一整天的时间来弄清楚为什么我的 DML 语句没有回滚。尽管我已经在 Internet 和 Whosebug 上进行了彻底的搜索 - 但我无法全神贯注。
我不会尝试通过 try catch 或 @ExceptionHandler 或 @ControllerAdvice 在任何地方捕获以下异常。无法弄清楚为什么我的查询没有回滚。这个问题听起来像是重复的,但 Whosebug 上的其他帖子 none 可以解决我的问题
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 作为我的数据库。
即使在抛出运行时异常之后,插入查询仍然存在于数据库中,应该回滚吧?有人可以告诉我我缺少什么吗
事务没有被回滚,因为 table 的引擎是 MyISAM。这个特定的引擎 不 支持 TJ 正确指出的交易(我不知道!)
我已将 table 的引擎更改为 InnoDB,事务正在按预期回滚。
再次感谢TJ!
我真的浪费了一整天的时间来弄清楚为什么我的 DML 语句没有回滚。尽管我已经在 Internet 和 Whosebug 上进行了彻底的搜索 - 但我无法全神贯注。
我不会尝试通过 try catch 或 @ExceptionHandler 或 @ControllerAdvice 在任何地方捕获以下异常。无法弄清楚为什么我的查询没有回滚。这个问题听起来像是重复的,但 Whosebug 上的其他帖子 none 可以解决我的问题
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 作为我的数据库。
即使在抛出运行时异常之后,插入查询仍然存在于数据库中,应该回滚吧?有人可以告诉我我缺少什么吗
事务没有被回滚,因为 table 的引擎是 MyISAM。这个特定的引擎 不 支持 TJ 正确指出的交易(我不知道!)
我已将 table 的引擎更改为 InnoDB,事务正在按预期回滚。
再次感谢TJ!