본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA/Spring

@Transactional Spring 트랜젝션, 실패시 되돌리다

@Transactional

하나의 table이라면 관련없으나

여러개의 table을 작성/수정시에는 중간에 에러날경우 롤백, 처음으로 되돌려야 한다.

Spring에는 애너테이션으로 트랜젝션기능을 제공한다.

@Transactional

 

 

controller에서는 service를 실행하고

@RequestMapping(value = "/manpower_edit", method = { RequestMethod.POST })
	public ResponseEntity<String> manpowerEdit(@ModelAttribute MpVO mpVO, HttpServletRequest req,
			HttpServletResponse res) {
//		System.out.println("전체 form정보: " + mpVO);
//		System.out.println("form에서 받은 정보입니다: " + mpVO.getCertif());
		mpService.updateMpAll(mpVO, mpVO.getEmpId());
//		if (true) {throw new RuntimeException("트랜잭션 실험을 위해 예외 발생!");}
		return new ResponseEntity<>("success", HttpStatus.OK);
	}

 

 

service는 update하면서 오류가나면 error를 발생시킨다.

	@Transactional
	public void updateMpAll(MpVO mpVO, int empId) {
		
		try {
			mpMapper.updateInfo(mpVO);
			for (MpVO.Certif certif : mpVO.getCertif()) {
				 if(certif.getCertifId() == 0) {
					 mpMapper.insertCertif(certif, empId);
				 }else {
					 mpMapper.updateCertif(certif, empId);
				 }
			 }
			for (MpVO.CoHistory coHistory : mpVO.getCoHistory()) {
				 if(coHistory.getHistoryId() == 0) {
				 mpMapper.insertCoHistory(coHistory, empId);
				 }else {
				 mpMapper.updateCoHistory(coHistory, empId);
				 }
			 }
			 mpMapper.updateExpYears(empId);
			 mpMapper.updateExpGrade(empId);
		    
			for (MpVO.Pjt pjt : mpVO.getPjt()) {
				if(pjt.getPjtId() == 0) {
				mpMapper.insertPjt(pjt, empId);
				}else {
				mpMapper.updatePjt(pjt, empId);
				}
			}
			for (MpVO.Edu edu : mpVO.getEdu()) {
				 if(edu.getEduId() == 0) {
				 mpMapper.insertEdu(edu, empId);
				 }else {
					 mpMapper.updateEdu(edu, empId);
				 }
			 }
			for (MpVO.School school : mpVO.getSchool()) {
				 if(school.getSchoolId() == 0) {
				 mpMapper.insertSchool(school, empId);
				 }else {
					 mpMapper.updateSchool(school, empId);
				 }
			 }
			 for (MpVO.Skill skill : mpVO.getSkills()) {
				 mpMapper.updateSkills(skill, empId);
			 }
		 } catch (Exception e) {
			 e.printStackTrace();
	         throw e;
		 }
	}

 

 

 

트렌젝션 성공시 서버는 성공(트렌젝션 성공)을 알리고 ajax는 이를 success처리한다.

if (data === 'success') 를 통해 success가 아닌경우 경고해주자.

 $.ajax({
                type: "POST",
                url: url,
                data: formData,
                success: function (data, xhr) {
                	alert(data);
                	if (data === 'success') {
                		alert(msg);
                        if ("${pageName[0]}" === 'write') {
                            javascript: pageLoad('${contextPath}/manpower/manpower_main');
                        }
                        else {
                            javascript: pageLoad(
                                '${contextPath}/manpower/manpower_sub?empId=${selectMpList[0].empId}'
                            );
                        } 
                    } else {
                    	alert("에러가 발생했습니다, 새로고침시 입력내용이 사라집니다.");
                    }
                },
                error: function (error) {
                	alert("에러가 발생했습니다, 새로고침시 입력내용이 사라집니다!");
                }
            });

 

 

 

 

확인해보자.

정상적인 코드일때는 잘 수정되고,

 

 

 

쿼리를 일부러 망칠경우(일부를 주석처리하여)

롤백되며 에러임을 알린다.

 <update id="updateCertif" parameterType="java.util.Map">
        UPDATE emp_certif
        SET
        C<!-- ERTIF_NAME = #{certif.certifName},
        COMPLET_DATE = 
            <if test="certif.completDate != null and certif.completDate != ''">#{certif.completDate}</if>
            <if test="certif.completDate == null or certif.completDate == ''">NULL</if>,
        CERTIF_INST --> = #{certif.certifInst},
        CERTIF_NUM = #{certif.certifNum}
        WHERE EMP_ID = #{empId} AND CERTIF_ID = #{certif.certifId}
    </update>

 

 

 

controller단에서 억지로 에러를 발생시킨경우에도 마찬가지.

@RequestMapping(value = "/manpower_edit", method = { RequestMethod.POST })
	public ResponseEntity<String> manpowerEdit(@ModelAttribute MpVO mpVO, HttpServletRequest req,
			HttpServletResponse res) {
//		System.out.println("전체 form정보: " + mpVO);
//		System.out.println("form에서 받은 정보입니다: " + mpVO.getCertif());
		mpService.updateMpAll(mpVO, mpVO.getEmpId());
		if (true) {throw new RuntimeException("트랜잭션 실험을 위해 예외 발생!");}
		return new ResponseEntity<>("success", HttpStatus.OK);
	}