1. 트랜잭션 격리수준(Transaction Isolation Level)
트랜잭션 격리수준은 동시에 여러 트랜잭션이 실행될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다. 격리 수준이 높아질수록 데이터의 일관성과 무결성은 보장되지만, 동시성과 성능은 떨어지게 된다. 데이터 정합성과 성능은 반비례 관계이다. 따라서, 각 애플리케이션의 요구사항에 맞는 적절한 격리 수준을 선택하는 것이 중요하다. 각 격리 수준은 특정 데이터 불일치 현상(Dirty Read, Non-Repeatable Read, Phantom Read)을 방지할 수 있다.
2. 트랜잭션 격리 수준 유형
트랜잭션 격리 수준은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE이 있다.
2 - 1. READ UNCOMMITTED
READ UNCOMMITTED는 가장 낮은 격리 수준으로, 커밋이 되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회하는 것을 허용한다. 성능은 좋지만 데이터 일관성이 보장되지 않는다. 발생할 수 있는 문제로 Dirty Read, Non-Repeatable Read, Phantom Read가 발생할 수 있다.
2 - 2. READ COMMITTED
READ COMMITTED는 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용한다. 특정 트랜잭션은이 이루어지는 동안, 다른 트랜잭션은 해당 데이터에 접근할 수 없다. 가장 많이 사용되는 격리 수준이다. 발생할 수 있는 문제로 Non_Reapeatable, Phantom Read가 발생할 수 있다.
2 - 3. REPEATABLE READ
REPEATABLE READ는 한 트랜잭션에서 특정 레코드를 조회할 때 항상 같은 데이터를 응답하는 것을 보장한다. 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있게 한다. 발생할 수 있는 문제로 Phantom Read 문제가 발생할 수 있다.
2 - 4. SERIALIZABLE
SERIALIZABLE은 가장 높은 격리 수준으로, 완벽한 읽기 일관성을 제공한다. 특정 트랜잭션이 사융중인 테이블의 모든 행을 다른 트랜잭션이 접근할 수 없도록 잠근다. 가장 높은 데이터 일관성을 가지짖만 성능이 가장 안 좋다.
3. 발생하는 문제들 정리
3 - 1. Dirty Read
Dirty Read는 한 트랜잭션이 다른 트랜잭션이 변경 중인 데이터를 읽는 경우 발생한다. 다른 트랜잭션이 아직 커밋되지 않은 데이터를 읽어서, 그 데이터가 나중에 롤백될 경우 트랜잭션의 결과가 변경될 수 있다. 이는 데이터의 일관성을 깨뜨릴 수 있다. 유일하게 READ UNCOMMITTED 에서 발생할 수 있는 문제다.
위의 다이어그램을 보면
- 트랜잭션 A가 이름을 "홍길동2"로 바꿨으나 아직 커밋하지 않았다.
- 트랜잭션 B가 조회하였더니 "홍길동2"가 조회된다.
- 트랜잭션 A는 rollback 한 상황이다.
- 트랜잭션 B는 잘못된 결과를 조회한 꼴이 된다.
3 - 2. Non-Repeatable Read
Non-Repeatable Read는 한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때, 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우를 말한다. 한 트랜잭션에서 똑같은 SELECT를 수행했을 때 항상 같은 결과를 반환해야 한다는 Repeatable Read 정합성에 어긋나게 된다. READ UNCOMMITTED, READ COMMITTED 에서 발생할 수 있는 문제다.
3 - 3. Phantom Read
Phantom Read는 한 트랜잭션이 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상이다. 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 나타나는 현상이다. READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ 에서 발생할 수 있다.
References
https://www.maeil-mail.kr/question/61
https://mangkyu.tistory.com/299
https://www.youtube.com/watch?v=QHWwNTGkwAU
https://haon.blog/database/transaction-isolation-level/
https://f-lab.kr/insight/transaction-propagation-isolation-levels-20240723
'백엔드 면접 질문' 카테고리의 다른 글
JPA에서 ID 생성 전략에 대해서 설명해주세요. (1) | 2024.12.07 |
---|---|
얕은 복사와 깊은 복사에 대해서 설명해주세요. (0) | 2024.12.04 |
데이터베이스 인덱스에 대해서 설명해주세요. (0) | 2024.12.02 |
일급 컬렉션이 무엇인가요? (1) | 2024.11.29 |
자바에서 Checked Exception과 Unchecked Exception에 대해서 설명해주세요. (0) | 2024.11.28 |