向數據庫插入數據的時候,經常會遇到異常。但是此時有的數據已經插入了,如果不回滾,那麼在拋出異常之前的數據都會被插入到數據庫。因此需要開啓事物。例子如下:
@Transactional(rollbackOn = { Exception.class }) @ResponseBody @RequestMapping("/submit") public Map<String, Object> submit(ITAssets iTAssets,HttpServletRequest request,ITAssetsLog iTAssetsLog) throws Exception { Map<String, Object> map = new HashMap<String, Object>(); try { //判斷工號、姓名、部門是否一致 HRUser userDao = hrUserDao.findByCode(iTAssets.getCode()); if (userDao == null) { map.put("success", false); map.put("msg", "不存在該工號!"); return map; } else { String userName = userDao.getName(); String department = userDao.getDepartment(); if (!userName.equals(iTAssets.getName()) || !department.equals(iTAssets.getDepartment())) { map.put("success", false); map.put("msg", "用戶信息不正確!"); return map; } } String name = request.getParameter("username"); //插入數據 iTAssets.setCreateDateTime(new Date()); //判斷計算機名是否重複 String pcName = iTAssets.getComputerName(); String productCode = iTAssets.getProductCode(); List<ITAssets> iTAsset = iTAssetsDao.findByComputerName(pcName); if (iTAsset.size() > 0) { map.put("success", false); map.put("msg", "存在重複計算機名!"); return map; } if (!productCode.equals("")) { List<ITAssets> iTAsse = iTAssetsDao.findByProductCode(productCode); if (iTAsse.size() > 0) { map.put("success", false); map.put("msg", "存在重複出廠編碼!"); return map; } } ITAssets it = iTAssetsDao.save(iTAssets); //根據code找到姓名 HRUser user = hrUserDao.findByCode(name); //插入日誌 iTAssetsLog.setBrand(iTAssets.getBrand()); iTAssetsLog.setCode(iTAssets.getCode()); iTAssetsLog.setComputerName(iTAssets.getComputerName()); iTAssetsLog.setCreateDateTime(new Date()); iTAssetsLog.setCreateUser(name); iTAssetsLog.setCreateUserName(user.getName()); iTAssetsLog.setDepartment(iTAssets.getDepartment()); iTAssetsLog.setId(iTAssets.getId()); iTAssetsLog.setMachineType(iTAssets.getMachineType()); iTAssetsLog.setModifyDate(iTAssets.getModifyDate()); iTAssetsLog.setModifyDetail(iTAssets.getModifyDetail()); iTAssetsLog.setModifyType(iTAssets.getModifyType()); iTAssetsLog.setName(iTAssets.getName()); iTAssetsLog.setProductCode(iTAssets.getProductCode()); iTAssetsLog.setType(iTAssets.getType()); iTAssetsLog.setiTAssetsId(it.getId()); iTAssetsLogDao.save(iTAssetsLog); map.put("success", true); map.put("msg", "插入成功"); return map; } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//開啓回滾 map.put("success", false); map.put("msg", "事物開啓了回滾,請聯繫系統管理員!"); return map; } }
可以參考:https://www.cnblogs.com/0201zcr/p/5962578.html
關於@Transactional(rollbackOn = { Exception.class })的用法,可以參考:https://www.cnblogs.com/wangfg/p/9475788.html
有的地方說:在service類前加上@Transactional,聲明這個service所有方法需要事務管理。每一個業務方法開始時都會打開一個事務。這還需要待驗證,礙於時間的關係,此時不作驗證。