spring手动事务适合于报除了RuntimeException异常等自定义异常时使用,因为自定义异常如果没有继承RuntimeException运行异常的话,是不会事务回滚的,因此我们可以在返回自定义异常后用上我们的spring手动事务使其回滚数据,使用案例如下,springmvc项目中ServiceImpl实现类中的用法。
public Map<String,Object> getList(){ Map<String,Object> resultMap = new HashMap<String,Object>(); xxxService.insert(数据1); List<Entity> list = xxxService.selectAll(); if(list > 0){ resultMap.put("result","数据已存在"); }else{ xxxService.insert(数据2); } return resultMap; }
�resultMap�返回的异常是要让前台用户知道的自己插入数据到数据库时出现了什么问题,但是虽然报了自定义异常给了前台用户,数据1已经被插入mysql数据库了,因为是自定义异常,所以即使你在service层中实现了事务回滚,也是没有办法回滚的,这时我们就需要实现spring手动事务回滚功能,代码如下:
public Map<String,Object> getList(){ Map<String,Object> resultMap = new HashMap<String,Object>(); xxxService.insert(数据1); List<Entity> list = xxxService.selectAll(); if(list > 0){ resultMap.put("result","数据已存在"); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }else{ xxxService.insert(数据2); } return resultMap; }
加入这一段代码的意思是:当数据存在时,前面插入的数据也要回滚:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
以上这段手动事务的代码是关键。