[JPA] 트랜잭션 롤백 시 주의 해야할 점!

트랜잭션을 롤백하면 DB 의 변경사항만 원래대로 돌아간다고 한다.!

수정된 상태로 영속성 컨텍스트에는 남아있다고 한다.

  • 만약 해당 내용을 모르고 JPA 를 사용한다면 엄청 위험한 상황이 도래할 수 있을 것 같다고 생각이 든다..
  • 라고 생각했지만 역시 스프링 프레임워크가 트랜잭션 AOP 시점에 다 컨트롤을 하고 있었군..

어떻게 대처?

  • 트랜잭션이 롤백된 영속성 컨텍스트를 그대로 사용하는 건 위험하다
    • 새로운 영속성 컨텍스트를 생성
    • 혹은
    • 엔티티매니저 의 clear 를 호출하여 영속성 컨텍스트를 초기화한 후에 사용해야 한다!

스프링의 접근 방식

  1. 기본 전략
    1. 트랜잭션 AOP 종료 시점에 트랜잭션 영속성 컨텍스트도 종료된다고 한다.
    1. 롤백후에 문제가 발생하지 안흥
  • 더 자세한 내용은
  • JpaTransactionManager 의 doRollback() 메서드를 참조할 수 있다고 한다.

그렇다면 doRollback 의 역할은 무엇일까?

  • 현재 활성화된 트랜잭션을 롤백한다.
    • 트랜잭션이 시작된 이후의 모든 Insert Update Delete 를 취소하고, DB를 트랜잭션 시작 전의 상태로 되돌린다.
  • 이점
    • 데이터의 무결성 보장
      • 로직상의 오류발생시 전후 사정을 고려하지 않고 코딩할 수 있게 도와준다
    • 복잡한 트랜잭션 관리
      • 개발자가 별도의 롤백 로직을 작성할 필요가 없다

Uploaded by N2T