트랜잭션?
트랜잭션은 하나의 데이터 교환 또는 변경을 안전하게 처리하도록 보장해 주는 것을 의미한다. 한 번의 애플리케이션 로직으로 인해 두 개 이상의 데이터가 영향을 받는 경우, 각각의 데이터에 대한 변경이 완전하게 끝난 후 데이터베이스에 정상적으로 반영하는 것이다. 만약 데이터 처리 중 문제가 발생 시 로직 실행 전으로 되돌리는 기능을 지원한다.
트랜잭션에 대해 모르신다면 아래 글을 읽어보시길 바랍니다.
📁[Database] 트랜잭션의 동작 원리와 ACID 속성
트랜잭션 격리성 ( Transaction Isolation )
트랜잭션의 격리성은 트랜잭션의 여러 특징들 중 하나이다.
격리성은 실행 중인 트랜잭션의 중간에 다른 트랜잭션이 접근할 수 없도록 하는 것을 뜻한다.
이런 격리성의 수준을 조절할 수 있고, DB에 따라 설정이 가능하며, Spring 어노테이션을 통해서도 설정할 수 있다.
이러한 격리성으로 인해 Dirty Read, Non-Repetable Read, Phantom Read의 문제점이 발생할 수 있다.
여러 트랜잭션이 동시에 적용될 때 생기는 문제
1. Dirty Read
다른 트랜잭션에 의해 수정되었지만, 아직 커밋되지 않은 상태의 데이터를 읽는 것을 말한다.
아래 그림에서 트랜잭션 1에서 data2를 insert 하고,
커밋하지 않은 상태에서 트랜잭션 2가 아직 커밋되지 않은 data2를 읽었다.
해당 data2는 커밋될지, 롤백될지 알 수 없다.
2. Non-Repeatable Read
하나의 트랜잭션에서 같은 키를 가진 데이터를 두 번 읽을 때, 그 결과가 다르게 나타나는 현상이다.
첫번째 Read와 두 번째 Read 사이에 다른 트랜잭션에서 값을 변경하거나 삭제하면 그 결과가 다르게 나타날 수 있다.
따라서 트랜잭션의 일관성을 해치는 문제가 발생한다.
그림에서 트랜잭션1은 key=2인 데이터를 두 번 읽는다.
그러나 select1와 select2 사이에 해당 데이터가 수정되었다.
따라서 select1의 결과와 select2의 결과가 달라지게 된다.
3. Phantom Read
Non-Repeatable Read와 유사하지만, 여러 개의 데이터를 조회할 때 발생한다는 점이 다르다.
일정 범위의 데이터를 2번(여러번) 읽을 때,
첫 번째 쿼리에 없던 유령(Phantom) 데이터가 두 번째 쿼리에서는 나타나는 현상이다.
아래 그림에서 트랜잭션 1은 key=1~3의 데이터를 두 번 조회한다.
트랜잭션 2에서 Select1과 Select2 사이의 시점에 data3을 저장하고 커밋하였다.
Select1에서는 두개의 데이터가 조회되고, Select2에서는 세개의 데이터가 조회되었다.
위의 격리성 관련 설정을 Spring에서 @Transactional 어노테이션 세부 설정을 통해 제어할 수 있다.
아래 글에서 해당 설명을 확인할 수 있습니다.
📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
트랜잭션 관련 글
📁[Database] 트랜잭션의 동작 원리와 ACID 속성
📁[Database] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정
📁[Java, Spring] 트랜잭션을 적용하는 여러가지 방법
📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
📁[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read
(참고) 인프런 - 김영한 님 스프링 DB 1편
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1#
'Database > 데이터베이스 이론' 카테고리의 다른 글
[DataBase] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정 (0) | 2024.03.19 |
---|---|
[Database] 트랜잭션의 동작 원리와 ACID 속성 (0) | 2024.03.19 |