개발스토리
회복과 병행제어4 본문
트랜잭션 읽기 쓰기 시나리오
트랜잭션 동시 실행 문제
■ 오손읽기(uncommitted dependency)
- 읽기 작업을 하는 트랜잭션1이 쓰기 작업을 하는 트랜잭션2가 작업한 중간 데이터를 읽기 때문에 생기는 문제
- 작업 중인 트랜잭션2가 어떤 이유에서 작업을 철회(ROLLBACK)할 경우 트랜잭션1은 무효가 된 데이터를 읽게 되고 잘못된 결과를 도출하는 현상
■ 반복 불가능 읽기(inconsistent analysis)
- 트랜잭션1이 데이터를 읽고 트랜잭션2가 데이터를 쓰고, 트랜잭션1이 다시 한 번 데이터를 읽을 때 생기는 문제
- 트랜잭션1이 읽기 작업을 다시 한 번 반복할 경우 이전의 결과와 다른 결과가 나오는 현상
■ 유령 데이터 읽기(phantom read)
- 트랜잭션1이 데이터를 읽고 트랜잭션 2가 데이터를 쓰고, 트랜잭션 1이 다시 한 번 데이터를 읽을 때 생기는 문제
- 트랜잭션1이 읽기 작업을 다시 한 번 반복할 경우 이전에 없던 데이터(유령 데이터)가 나타나는 현상
- 트랜잭션1이 트랜잭션2가 새로운 데이터를 삽입한 사실을 모르고 작업을 했기 때문
트랜잭션 고립 수준 명령어
DBMS가 트랜잭션을 실행시키면서 LOCK보다 좀 더 완화된 방법으로 문제를 해결하기 위해 제공하는 명령어
■ READ UNCOMMITTED
- 고립 수준이 가장 낮은 명령어로, 자신의 데이터에 아무런 공유락을 걸지 않는다.
- 배타락은 갱신 손실 문제 때문에 걸어야 한다.
- 다른 트랜잭션에 공유락과 배타락이 걸린 데이터를 대기하지 않고 읽는다. 심지어 다른 트랜잭션이 커밋하지 않은 데이터를 읽을 수 있다. 그 때문에 오손 페이지의 데이터를 읽게 된다. 이 명령어는 SELECT 질의의 대상이 되는 테이블에 대해서 락을 설정하지 않은 것과 같다.
■ READ COMMITTED
- 오손 페이지의 참조를 피하기 위해 자신의 데이터를 읽는 동안 공유락을 걸지만 트랜잭션이 끝나기 전에라도 해지 가능하다.
- 다른 트랜잭션 데이터는 락 호환성 규칙에 따라 진행한다. 이 옵션은 오라클의 기본 설정으로 아무런 설정을 하지 않으면 이 방식으로 수행된다.
■ REPEATABLE READ
- 자신의 데이터에 설정된 공유락과 배타락을 트랜잭션이 종료할 때까지 유지하여 다른 트랜잭션이 자신의 데이터를 갱신할 수 없도록 한다.
- 다른 트랜잭션 데이터는 락 호환성 규칙에 따라 진행한다. 다른 고립화 수준에 비해 데이터의 동시성이 낮아 특별하지 않은 상황이라면 사용하지 않는 것이 좋다.
■ SERIALIZABLE
- 고립 수준이 가장 높은 명령어로, 실행 중인 트랜잭션은 다른 트랜잭션으로부터 완벽하게 분리된다.
- 데이터 집합에 범위를 지어 잠금을 설정할 수 있기 때문에 다른 사용자가 데이터를 변경하려고 할 때 트랜잭션을 완벽하게 분리할 수 있다. 이 명령어는 네 가지 고립화 수준 중에 제한이 가장 심하고 데이터의 동시성도 낮다. 이 명령어는 SELECT 질의의 대상이 되는 테이블에 미리 배타락을 설정한 것과 같은 효과를 낸다.
'Computer Science > 데이터베이스' 카테고리의 다른 글
Database Connection Pool (1) | 2021.08.30 |
---|---|
권한 관리 (0) | 2021.06.07 |
회복과 병행제어3 (0) | 2021.05.25 |
회복과 병행제어2 (1) | 2021.05.25 |
회복과 병행 제어 (0) | 2021.05.24 |