참조 사이트 1
참조 사이트 2
참조 사이트 3(트랜잭션의 특징관련)
참조 사이트 4(트랜잭션의 특징관련)
스프링에서 @Transactional어노테이션은 일반적으로 DB에서 데이터를 조회, 생성, 삭제, 수정 을 하는경우 메소드 상단에 @Transactional어노테이션을 붙이고 설정값은 readOnly정도만 사용하지만
대용량 동기화, 배치등을할때 트랜잭션 설정값을 사용해야 한다고 한다.
dirty read(원하는 것이 아닌 다른 데이터 들도 전부 읽어옴)
(트랜잭션의 격리성에 대해서 알아보고그에 연관된 3가지 문제점에 대해서 알고 오면 왜 사용해야하는지 이해하기가 쉽다)
READ_UNCOMMITTED(level 0) : 트랜잭션 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
Dirty read : 다른 트랜잭션에서 처리하는 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상, 해당 수준에서만 일어나는 현상
READ_COMMITTED(level 1) : dirty read 방지(확정된 데이터만 읽는 것 허용), 데이터를 변경하는 동안 다른 사용자는 해당 데이터에 접근 불가
REPEATABLE_READ(level 2) : 트랜잭션이 완료 될 떄 까지 select 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당 되는 데이터에 대한 수정이 불가능, 트랜잰션 종료까지 갱신, 갱신 삭제가 불허되어 일관성 있는 결과를 리턴함
SERIALIZABLE(level 3) : 완벽한 읽기 일관성 모드 제공, 데이터 일관성 및 동시성을 위해 MVCC을 사용하지 않음, 트랜잭션이 완료 될 때까지 select 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능
REQUIRED : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성
REQUIRES_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성
SUPPORT : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 nontransactionally로 실행
MANDATORY : 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생
NOT_SUPPORT : nontransactionally로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지
NEVER : nontransactionally로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생
NESTED : 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있음. 둘러싼 트랜잭션이 없을 경우 REQUIRED와 동일하게 작동
해당 트랜잭션을 읽기전용으로 하는 경우 사용
데이터를 조회하는 select 관련 메서드의 경우 해당 설정 사용
@Transactional(readOnly = true)
롤백을 유발하는 예외 클래스를 지정
@Transactional(rollbackFor=Exception.class)
기본값 없음
특정 예외가 발생하더라도 롤백되지 않도록 설정
@Transactional(noRollbackFor=Exception.class)
지정한 시간내에 메소드가 실행되지 않은 경우 롤백하는 설정
숫자를 -1로 쓰면 지정된 시간이 없음(default)
@Transactional(timeout=5)