본문으로 건너뛰기

트랜잭션과 Propagation

스프링/스프링부트 에서 선언형 어노테이션 @Transactional 을 사용해서 트랜잭션 처리를 하곤 한다.
적절하게 수정하거나, 작성해야 하므로 정리 해보자

일단, 트랜잭션 어노테이션은

  • 메서드
  • 클래스

다 사용 가능하다.
메서드에 사용할 경우 public 이여야 한다.

isolation 격리 수준

READ_UNCOMMITTED(level 0)

트랜잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
어떤 사용자가 A라는 데이터를 B로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty) 데이터 B를 읽을 수 있다.

Dirty read : 위와 같이 다른 트랜잭션에서 처리하는 작업ㅇ치 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상을 dirty read 라고 하며, READ_UNCOMMITTED격리수준에서만 일어나는 현상

READ_COMMITTED(level 1)

dirty read 방지 : 트랜잭션이 커밋되어 확정된 데이터만을 읽는 것을 허용
어떠한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없다.

REPEATABLE_READ(level 2)

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.

선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함 으로써 같은 데이터를 두번 쿼리했을 때 일관성 있는 결과를 리턴 한다.

SERIALIZABLE(level 3)

완벽한 읽기 일관성 모드를 제공
데이터의 일관성, 및 동시성을 위해 MVCC(Multi Version Concurrency Control)을 사용하지 않음
MVCC는 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회 시 LOCK을 사용하지 않고 데이터의 버전을 관리해
데이터의 일관성 및 동시성을 높히는 기술
트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.


propagation 전파옵션

REQUIRED : 부모 트랜잭션 냉에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성
REQUIRES_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성
SUPPORT : 부모 트랜잭션 냉에서 실행하며 부모 트랜잭션이 없을 경우 nontransactionally 로 실행
MANDATORY : 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을경우 예외가 발생
NOT_SUPPORT : nontransactionally로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지
NEVER : nontransactionally로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생
NESTED : 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백 될 수 있음. 둘러싼 트랜잭션이 없을 경우 REQUIRED와 동일하게 작동

no-rollback-for 예외처리(기본값 : 없음)

특정 예외가 발생하더라도 롤백되지 않도록 설정


스프링 배치 에서의 트랜잭션
스프링 배치에서는 Tasklet에서 기본적으로 step 단위 트랜잭션을 지원하고 있다.
기본적으로 job 이 하나의 tasklet 의 step으로 실행되다 보니 명시적이진 않지만 내부적으로 전체 트랜잭션으로 걸려있게 된다.
job 내 dao delete 메소드에서 @Transactional 설정을 하고 그 dao 메소드에를 반복문에 의해 delete하는 로직을 수행하는 부분이 있었는데, 부모의 트랜잭션으로 인해 dao를 몇번 호출하더라도 job 단위로 트랜잭션이 걸려있으므로
(트랜잭션은 반복문이 끝나야 적용되는 것)
그러므로 전파 옵션을 바꿔서 개별 트랜잭션으로 생성해줘야 한다는....

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)

요로코롬 바꿔준다.


부모 자식간의 트랜잭션 움직임에 대하여..

oingdaddy.tistory.com/m/28