들어가기 전에 )
트랜잭션이란?
- 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위
트랜잭션의 특징 ACID
- Atomicity(원자성)
- 트랜잭션을 구성하는 연산 전체가 모두 정상적으로 실행되거나 모두 취소되어야 한다.
- Consistency(일관성)
- 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지한다.
- Isolation(고립성,격리성)
- 두 개 이상의 트랜잭션이 동시에 발생할 때, 서로의 연산에 영향을 주면 안된다.
- Durability(영구성)
- 커밋된 트랜잭션의 내용은 영구히 반영된다.
격리성 이슈
격리성을 보장한다면 순차적으로 트랜잭션이 실행되기 때문에 동시성 문제(응답지연)가 발생합니다.
그렇다고 병렬적으로 트랜잭션이 실행되면 데이터 무결성이 깨질 수 있습니다.
1. 격리성과 동시성으로부터 나타날 수 있는 문제점
Dirty Read, Non-Repeatable Read, Phantom Read 3가지가 있습니다.
1-1. Dirty Read
다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 테이터를 읽는 것
1-2. Non-Repeatable Read
한 트랜잭션 내에서 같은 Key를 가진 Row를 두 번 읽었는데 그 사이에 값이 변경되거나 삭제되어 결과가 다르게 나타나는 현상
1-3. Pantom Read
한 트랜잭션 내에서 같은 쿼리를 두번 수행했는데, 첫번째 쿼리에서 없던 유령(Phantom) 레코드가 두번째 쿼리에서 나타나는 현상
여기서 Phantom Read와 Non-Repeatuable Read를 헷갈릴 수 있습니다. Non-Repeatable Read는 1개 Row의 데이터의 값이 변경되는 것이며 Phantom Read는 다건을 요청하는 것에 대해서 데이터의 값이 변경되는 것입니다.
2. 트랜잭션 격리 수준
위 문제점을 해결하기 위해 ANSI표준에서 트랜잭션의 격리성과 동시 처리 성능 사이의 Trade-off를 두고 4단계 격리수준을 나누었습니다. 내려갈수록 격리 수준이 높아져서 언급된 이슈는 적게 발생하지만 동시 처리 성능은 떨어집니다.
Read Uncommitted
- 커밋하지 않은 데이터를 읽을 수 있음
- 트랜잭션 1이 수정중이고 커밋하지 않아도 트랜잭션 2가 데이터를 조회
- 문제점
- Dirty Read, Non-Repeatable Read, Phantom Read가 일어날 수 있음
Read Committed
- 커밋한 데이터만 읽을 수 있음
- 트랜잭션 1이 회원 A를 조회 중인데 트랜잭션 2가 회원 A를 수정하고 커밋하면 트랜잭션 1이 다시 회원 A를 조회했을 때 수정된 데이터가 조회
- 같은 트랜잭션 안에서 다른 데이터가 조회
- row lock이 필요할 수도 있음
- Dirty read가 발생하지 않음
- 문제점
- NON - Repeatable Read가 발생 할 수도 있음
Repeatable Read
- 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 반복해서 조회. 하지만 추가되어 조회될 수 있다.
- 트랜잭션 1이 10살 이하의 회원을 조회했는데, 트랜잭션 2가 5살 회원을 insert하고 커밋하면 다시 조회 했을 때 회원 하나가 추가된 상태로 조회
- 이유
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능
- 문제점
- update는 불가능 하지만 insert는 가능하여 PHANTOM READ 가 발생
- table lock이 필요할 수도 있음
Serializable
- 가장 엄격한 트랜잭션 격리 수준
- Phantom read가 발생하지 않음.
- 동시성 처리 성능이 급격히 떨어질 수 있음.
Mysql 의 InnoDB스토리지 엔진의 기본 Isolation Level이 REPEATABLE-READ 이고 Oracle 은 READ-COMMITED 입니다.
Oracle 은 READ-COMMITED 와 SERIALIZABLE 만 지원하며 나머지 두가지 isolation level 은 지원하지 않습니다.
'CS 공부' 카테고리의 다른 글
웹 서버(Web Server)와 웹 애플리케이션 서버(WAS) (0) | 2024.02.22 |
---|---|
Servlet (0) | 2023.08.07 |