DB의 격리 수준
1. Read Uncommited
- commit 이나 rollback 여부 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
- 정합성 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장한다.
- commit되지 않은 상태지만, update된 값을 다른 트랜잭션에서 읽을 수 있다.
- Dirty Read 발생 트랜잭션 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상
2. Read Commited
- Dirty Read 발생 x
- 실제 테이블에서 가져 오는 것이 아니라, undo 영역에 백업 된 레코드에서 값을 가져온다.
- T1이 commit한 이후 아직 끝나지 않은 T2가 다시 테이블 값을 읽으면 값이 변경 됨을 알 수 있다.⇒ 입, 출금의 금전적인 처리에서 주로 발생
- ⇒ Reapeatable Read 정합성에 어긋남: 하나의 트랜잭션 내에서 똑같은 select 쿼리 실행 시 항상 같은 결과를 가져오지 않는다.
3. Repeatable Read
- MySQL에서는 트랜잭션 마다 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
- Undo 공간에 백업해두고 실제 레코드 값을 변경한다.
- 백업 된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제한다.
- Undo에 백업 된 레코드가 많아지면 MySQL 서버의 처리 성능이 떨어질 수 있다.
- Phantom Read 발생: 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상 (이를 위해 쓰기 잠금 필요)
4. Serializable
- Phantom Read 발생 x
Transaction ACID
Spring Transaction
- 개발자가 직접 transaction 관련 코드 작성
- : 개발자가 상세하게 다양한 상황을 고려한 tx 관리 기능
- 선택적 방법 tx 관리(AOP로 처리): xml, Anotation
TX 문제 상황
- Dirty Read
- Unrepeatable Read
- phantom Read
@Transactional
- DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메소드에 어노테이션을 달아준다.
- 일련의 작업들을 묶어서 하나의 단위로 처리하고 싶다면, 면 @Transactional을 활용하자.
- 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다.
- ⇒ 게시글 삭제 메소드
@Transactional(readOnly = true)
- 트랜잭션을 읽기 전용으로 설정
- 성능 최적화위해 사용하거나, 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는 것을 의도적으로 방지하기 위해 사용
단, AutoIncrement 는 트랜잭션 범위 밖에서동작하기 때문에 rollback되어도 다시 감소하지 않는다.
참고: https://velog.io/@betterfuture4/Spring-Transactional-총정리
'cs 기술 면접 공부' 카테고리의 다른 글
Spring AOP (0) | 2023.05.11 |
---|---|
AJAX (0) | 2023.03.20 |
데이터 저장소, JSON (0) | 2023.03.16 |
JavaScript (2) (0) | 2023.03.16 |
Java Script (1) (0) | 2023.03.16 |