SSM事务——事务回滚如何拿到返回值

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";
        
    }

 

posted @ 2017-12-19 11:12  低调人生  阅读(4145)  评论(0编辑  收藏  举报