java事物的回滾

向數據庫插入數據的時候,經常會遇到異常。但是此時有的數據已經插入了,如果不回滾,那麼在拋出異常之前的數據都會被插入到數據庫。因此需要開啓事物。例子如下:

@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所有方法需要事務管理。每一個業務方法開始時都會打開一個事務。這還需要待驗證,礙於時間的關係,此時不作驗證。


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章