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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM