MySQL数据库一共向用户提供了包括BDB、HEAP、ISAM、MERGE、MyISAM、InnoDB以及Gemeni这7种Mysql表类型。其中BDB、InnoDB属于事务安全类表,而其他属于事务非安全类表。
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
问题:在service层出现异常需要回滚,但是有一个值必须返回给service的调用者,不知道该如何及回滚,又可以正常返回值
通过自定义一个异常传递数据
1、通过抛出异常,会回滚,但是拿不到想到的返回结果
@Transactional @Override public int AddUser(User users) throws UserException { // TODO Auto-generated method stub int i=0; try { userMapper.AddUser(users); int a=6/0; userMapper.AddUser(users); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("会回滚,但 拿不到值..."); } return i; }
2、通过finally{}返回结果,但是事务不会回滚
// finally 没有抛出异常给spring,spring不会操作回滚
@Transactional @Override public int AddUser(User users) throws UserException { // TODO Auto-generated method stub int i=0; try { userMapper.AddUser(users); int a=6/0; userMapper.AddUser(users); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("不会回滚,可以 拿值..."); } finally{ //这样就不能 回滚了 return i; } }
3、定义一个runtimeException ,可以传递 数据
public class UserException extends RuntimeException { /* * 自定义 异常 RuntimeException */ public UserException(String s){ super(s); } } @Transactional @Override public int AddUser(User users) throws UserException { // TODO Auto-generated method stub int i=0; try { userMapper.AddUser(users); int a=6/0; userMapper.AddUser(users); } catch (Exception e) { e.printStackTrace(); throw new UserException("可以传递想要的值,拿到值"); } return i; }
这样在Controller层就可以通过catch 的 e.getMessage() 拿到值了
@RequestMapping("/addUser") public String addUser(){ User user=new User(); try { userService.AddUser(user) ; } catch (Exception e) { //拿到 事务回滚并 传递的值 System.out.println(e.getMessage()); } return "redirect:/user/findAll.action"; }