드코
2k
2019-11-28 10:46:30
2
198

java 트렌젝션 간단하게 익혀보려고 공부중에 예제를 만들었는데 잘 모르는게 생겼습니다.



	@Transactional
	@RequestMapping(value = "/bbsTran")
	public String bbsTran(Model model) { 
		try{
			dao.insertFirst(); // 트렌젝션 테스트
			dao.insertTwo(); // 트렌젝션 테스트 two에서 인서트 오류 시 First 인서트도 취소안됨
			return "views/bbs";
		}catch(Exception e){
			e.printStackTrace();
			return "views/error";
		}
	}
	@Transactional
	@RequestMapping(value = "/bbsTran2")
	public String bbsTran2(Model model)throws Exception{ 		
		dao.insertFirst(); // 트렌젝션 테스트
		dao.insertTwo(); // 트렌젝션 테스트 two에서 인서트 오류 시 First 인서트도 취소가 됨
		return "views/bbs";		
	}

bbsTran 과 bbsTran2가 있는데

bbsTran2는 insertTwo에서 인서트 시도 시 에러가나면 insertFirst에서 인서트낸것도 취소가 되어 있습니다.

하지만 bbsTran에서는 에러가나서 catch로 빠졌는데도 insertFirst에 값이 테이블에 들어와 있습니다.

왜 try,catch를 썻을때는 트렉젝션이 작동을 안하는건가요??

2
0
  • 답변 2

  • 밤아홉시
    382
    2019-11-28 11:13:34

    Exception을 던지지 않고, 메서드 내부에서 이미 처리하셨기 때문입니다.

    1
  • 드코
    2k
    2019-11-28 13:55:29 작성 2019-11-28 13:56:55 수정됨

    밤아홉시 님 감사합니다

    해결 하였습니다.

    첫번째 방법

    	@Transactional(rollbackFor={Exception.class})//Exception이 발생해도 롤백 시킴
    	@RequestMapping(value = "/bbsTran")
    	public String bbsTran(Model model)throws Exception { 
    		try{
    			int a = dao.insertFirst(); // 트렌젝션 테스트
    			System.out.println("@@TEST1 : " + a);
    			dao.insertTwo(); // 트렌젝션 테스트 two에서 인서트 오류 시 
    			return "views/bbs";
    		}catch(Exception e){ //try catch일때는 트렉젠션이 롤벡이 안된다. Exception발생한걸 throw new Exception()로 던져야 롤백됨
    			// Exception이 try catch를 쓰게되면 메소드 내에서 처리가 되므로 트렌젝션이 발동하지 않음
    			e.printStackTrace();
    			throw new Exception();// 메소드밖으로 Exception을 던지게 함으로 써 트렌젝션 발동
    			//return "views/error";
    		}
    	}

    두번째 방법

    @Transactional
    	@RequestMapping(value = "/bbsTran3")
    	public String bbsTran3(Model model) { 
    		try{
    			int a = dao.insertFirst(); // 트렌젝션 테스트
    			System.out.println("@@TEST1 : " + a);
    			dao.insertTwo(); // 트렌젝션 테스트 two에서 인서트 오류 시 
    return "views/bbs"; }catch(Exception e){ // Exception이 try catch를 쓰게되면 메소드 내에서 처리가 되므로 트렌젝션이 발동하지 않음 e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();// 무조건 롤백 하도록 설정 return "views/error"; } }


    첫번째 방법처럼 에러났다고 메소드밖으로 던져서 에러를 알리면 트렌젝션이 발동한다는것을 알았습니다.

    두번째 방법처럼 에러가나서 catch에 왔을 시 무조건 롤백을 하도록 설정을 하는 방법도 알았습니다.

    두번째방법이 개인적으로는 원하는 리턴값도 같이 줄 수있어서 좋은거 같습니다.


    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.