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