트랜잭션(Transaction)이란?
데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위,
요약하자면 그냥 작업 단위로 이해하면 된다.
트랜잭션의 4가지 속성
1. 원자성(Atomicity)
2. 일관성(Consistency)
3. 독립성(Isolation)
4. 지속성(Durability)
트랜잭션의 연산 -> 커밋(Commit) / 롤백(Rollback)
커밋은 트랜잭션의 결과를 반영하는 것이고, 롤백은 데이터베이스의 상태를 트랜잭션 시행 전으로 되돌리는 것이다.
트랜잭션끼리 충돌하거나 경쟁하면 문제가 생긴다.
문제점1. Dirty Read
ex. 트랜잭션A는 테이블의 3번째 row 수정중 vs 트랜잭션B는 테이블의 3번째 row 조회하려고 함
문제점2. Non-Repeatable Read
ex. 트랜잭션A가 테이블을 처음 조회 vs 트랜잭션B가 수정 후 커밋 vs 다시 조회했을 때 내용 다름
문제점3. Phantom Read
ex. 일정 범위의 데이터를 여러번 읽을 때, 첫번째 쿼리에서는 없던 유령(phantom) 데이터가 두번째에서는 나타나는 현상
그러한 문제들을 해결하기 위하여 Spring에서 Transaction에 대하여 여러 세부적인 설정들을 할 수 있음
1. Isolation(격리 수준)
트랜잭션에서 일관성이 없는 데이터를 허용하는 수준 ex. @Transactional(isolation = Isolation.DEFAULT)
- DEFAULT: 데이터베이스의 기본적인 격리수준을 사용
- READ_UNCOMMITTED: dirty read가 발생해도 허용하는 정도
- READ_COMMITTED: dirty read는 허용하지 않음
- REPEATABLE_READ: non-repeatable read 만큼은 방지
- SERIALIZABLE: phantom read를 방지
2. Propagation(전파수준)
트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황
트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법에 대하여 결정하는 속성값
- REQUIRED
- SUPPORTS
- REQUIRES_NEW
- NESTED
NESTED 사용 예시
EX) 일기 작성 관련해서 로그를 DB에 저장하는 상황
로그 저장이 실패한다면 -> 일기 작성까지 롤백되면 안 됨
일기 저장이 실패한다면 -> 로그 작성까지 롤백되어야함
3. readOnly 속성
트랜잭션을 읽기 전용 속성으로 지정
@Transactional(readOnly = true)
@Transactional(readOnly = false) -> 주로 수정이 필요한 트랜잭션에 대하여 false 값 설정
4. 트랜잭션 롤백 예외
예외가 발생했을 때 트랜잭션 롤백 시킬 경우에 대하여 설정(어떤 예외는 롤백 시키고 어떤 예외는 롤백 시키지 않음)
@Transactional(rollbackFor = Exception.class)
@Transactional(noRollbackFor = Exception.class)
Default : RuntimeException, Error
5. Timeout 속성
일정 시간 내에 트랜잭션을 끝내지 못하면 롤백시키게 설정
ex. @Transactional(timeout=10) 10초안에 끝내지 못하면 롤백