[Spring Annotation] @Transaction
트랜잭션(Transaction)
데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위
작업 단위
ex) 트랜잭션 : 일기 작성하기
(1) 오늘 날씨 데이터를 가져와서
(2) 일기를 DB에 저장하기
원자성(Atomicity) - transaction이 DB에 모두 반영이되거나 반영이 되지 않는다. (commit or Rollback)
일관성(Consistency) - transaction의 작업처리 결과는 항상 일관성이 있어야 한다.
독립성(Isolation) - 독립적으로 하나의 transaction이 수행되고, 그 다음 transaction이 수행되어야 한다.
지속성(Durability) - 변화된 상태가 쭉 지속(영구적)이 되어야 한다.
주로 DB에 문제가 생겼을때 롤백 시키기 위해 사용한다.
트랜잭션 연산
- 커밋(Commit)
- 롤백(Rollback)
여러 트랜잭션이 경쟁하면 생기는 문제
트랜잭션 A : Diary 테이블의 3번째 row 수정중
트랜잭션 B : Diary 테이블의 3번째 row 조회하려고 하는 상황
문제점
1. Dirty Read
동시에 진행되고 있는 다른 트랜잭션에서 변경한 데이터를 현재 진행 중인 트랜잭션에서 읽어 들이는 문제
2. Non-Repeatable Read
한 트랜잭션 내에서 반복 읽기를 수행하면 다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라지는 문제
트랜잭션의 일관성을 해치게 되는 문제
특정 값을 두 트랜잭션이 경쟁했을때 생기는 문제
트랜잭션 A : Diary 테이블의 3번째 row 조회 * 2
트랜잭션 B : Diary 테이블의 3번째 row 수정 후 커밋
3. Phantom Read
한 트랜잭션이 아닌 일정 범위 내의 여러 트랜잭션
특정 범위 내에서의 값을 경쟁했을 때 생기는 문제
트랜잭션 A : Diary 테이블의 0~4번째 row 조회 * 2
트랜잭션 B : Diary 테이블의 3번째 row 수정 후 커밋
@Transaction
클래스, 메서드 위에 어노테이션을 추가할 수 있다.
트랜잭션 기능이 적용된 프록시 객체 생성
(PlatformTransaction Manager)
Spring Transaction의 세부 설정
(1) Isolation(격리 수준)
(2) Propagation(전파 수준)
(3) ReadOnly 속성
(4) 트랜잭션 Rollback 예외
(5) timeout 속성
(1) Isolation(격리 수준)
트랜잭션에 일관성이 없는 데이터를 허용하는 수준
- DFEAULT
- READ_UNCOMMITTED (Dirty Read 발생)
- READ_COMMITTED (Dirty Read 방지)
- REPEATABLE_READ (Non-Repeatable Read 방지)
- SERIALIZABLE (Phantom Read 방지)
@Transactional(isolation=Isoolation.DEFAULT)
(2) Propagation(전파 수준)
트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황
트랜잭션을 시작하거나
기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성값
- REQUIRED (기본값)
- SUPPORTS
- REQUIRES_NEW
- NESTED
NESTED 사용 예시
ex ) 일기 작성 관련해서 로그를 DB에 저장하는 상황
1. 로그 저장이 실패한다과 해서 일기 작성까지 롤백이 되면 안된다.
2. 일기 작성이 실패한다면 로그 작성까지 롤백되어야 한다.
(3) readOnly 속성값
트랜잭션을 읽기 전용 속성으로 지정
성능 향상에 도움을 줌(성능 최적화)
@Transactional(readOnly=true)
(4) 트랜잭션 롤백 예외
예외가 발생했을때 트랜잭션 롤백시킬 경우를 설정
@Transactional(rollbackFor=Exception.class)
@Transactional(noRollbackFor=Exception.class)
Default : RuntimeException, Error
(5) Timeout 속성
일정 시간 내에 트랜잭션을 끝내지 못하면 롤백
@Transactional(timeout = 10)