일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- docker
- 클린코드
- java
- Java 22
- Be
- hateoas
- 미니미프로젝트
- G1GC
- Spring/JAVA 서적
- 스프링으로하는마이크로서비스구축
- Solid
- RESAPI
- DB
- ATDD
- 마이크로서비스디자인패턴
- testdrivendevelopment
- 트랜잭션 격리 수준
- 부모객체
- 완벽이해
- pair programming
- Runtime Area
- GC
- 도커
- KPT
- ComponentScan
- 자식객체
- Execution Engine
- Self Descript Message
- M:N
- TDD
- Today
- Total
Programming Summary
DB) 트랜잭션 격리수준이란? 본문
트랜잭션의 격리 수준(Transaction Isolation Level)
트랜잭션의 격리 수준이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 격리 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED가 존재한다.
SERIALIZABLE
SERIALIZABLE은 가장 엄격한 격리 수준으로, 이름 그대로 여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로, 어떠한 데이터 부정합 문제도 발생하지 않는다. 하지만 모든 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다.
REPEATABLE READ
일반적인 RDBMS는 변경 전의 레코드를 언두 공간에 백업한다. 그러면 변경 전/후 데이터가 모두 존재하므로, 동일한 레코드에 대한 여러 버전의 데이터가 존재하여 이를 MVCC라고 부른다. MVCC를 통해 트랜잭션이 롤백된 경우, 데이터를 복원할 수 있을 뿐만 아니라 ,서로 다른 트랜잭션 간에 접근할 수 있는 데이터를 세밀하게 제어할 수 있다.
REPEATABLE READ는 이런 MVCC를 이용해 한 트랜잭션 내에서 동일한 결과를 보장하지만, 새로운 레코드가 추가되는 경우에 부정합이 생길 수 있다. 즉, REPEATABLE READ는 어떤 트랜잭션이 읽은 데이터를 다른 트랜잭션이 수정하더라도 동일한 결과를 반환할 것을 보장해준다. 따라서 SELECT로 조회한 경우 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견될 수 있는데, 이를 유령 읽기(Phantom Read)라고 한다. MySQL에서는 이러한 상황을 방지하기 위해 갭 락을 걸게 된다. 그러면 insert를 다른 트랜잭션에서 요청을 하게 될 때 gap Lock에 걸려 커밋될 때까지 대기하게 된다.
READ COMMITTED
read committed는 커밋된 데이터만 조회할 수 있다. 이에 Phantom Read에 더해 Non-repeatable read(반복 읽기 불가능) 문제까지 발생한다.
READ UNCOMMITTED
read uncommitted는 커밋하지 않은 데이터조차도 접근할 수 있는 격리 수준이다. 이는 다른 트랜잭션의 작업이 커밋 또는 롤백되지 않아도 즉시 보이게 된다. 이렇듯 어떤 트랜잭션의 작업이 완료되지 않았는데도, 다른 트랜잭션에서 볼 수 있는 부정합 문제를 Dirty Read(오손 읽기)라고 한다. Dirty Read는 데이터가 조회되었다가 사라지는 현상을 초래하므로 시스템에 상당한 혼란을 주게 된다.
트랜잭션의 격리 수준 요약
MySQL은 갭락을 통해 팬텀 리드가 거의 발생하지 않고, read committed보다는 동시 처리 성능은 뛰어난 repeatable read를 사용한다.
참고
'CS 공부' 카테고리의 다른 글
Infra) 인터넷경계 로드밸런서(Load Balancer)는 어디에 위치할까? (2) | 2024.04.09 |
---|---|
Java) GC란? (4) | 2024.03.28 |
DB) MVCC(Multi Version Concurrency Control)란? (0) | 2023.09.22 |
DB) 인덱스란? (1) | 2023.09.21 |
Java) JVM이란? (1) | 2023.09.08 |