<데이터베이스 개론과 실습>을 요약 정리한 글입니다.
문제가 될 시 글을 내리도록 하겠습니다.
1. 트랜잭션
트랜잭션
트랜잭션은
DBMS가 데이터 베이스를 다룰 때 사용하는 작업(프로그램) 단위 (데이터를 다루는 논리적인 작업 단위)이다.
트랜잭션은 데이터베이스의 무결성을 유지하기 위해 원자성, 일관성, 고립성, 지속성의 성질을 가진다.
트랜잭션을 통해 장애 발생시 데이터를 복구하는 작업의 단위로 삼을 수 있고,
여러 작업이 동시에 같은 데이터를 다룰 때 트랜잭션을 통해서 작업을 서로 분리하는 단위로 삼을 수 있다.
트랜잭션의 과정은 아래와 같다.
- 데이터베이스의 데이터가 하드웨어에 저장되어 있음
- 데이터 처리를 위해 주기억장치 버퍼로 사본을 읽어옴
- 버퍼에 저장된 데이터를 수정한 후
- 데이터베이스에 다시 저장
간단한 사례를 들어보면,
- 뽀로로의 잔액을 하드디스크(데이터베이스)에서 주기억장치 버퍼로 읽어옴
- 크롱의 잔액을 하드디스크(데이터베이스)에서 주기억장치 버퍼로 읽어옴
- 뽀로로 계좌에서 100원을 인출한 값을 저장
- 크롱의 계좌에서 100원을 입금한 값을 저장
- 뽀로로의 계좌 잔액을 주기억장치 버퍼 → 하드디스크(DB)에 저장
- 크롱의 계좌 잔액을 주기억장치 버퍼 → 하드디스크(DB)에 저장
1→ 2→ 3→ 4→ COMMIT → 4 → 5로 이루어지는데,
이유는 각각의 트랜잭션이 하드디스크에 개별로 접근하는 것을 피하고
DBMS가 일괄적으로 하드디스크에 접근하여 처리함으로써 빠른 응답성을 보장하기 위함이다.
일반적으로 DB에 기록하는 과정은 시간이 많이 소요되고,
다른 트랜잭션이 테이블의 정보를 필요로 할 수 있기 때문에 임시 종료 후 일괄적으로 DB에 기록한다.
여기서 COMMIT은 부분완료, 4, 5가 이루어지고 난 뒤로는 찐(?) 완료 (COMMIT)D이다.
부분완료는 트랜잭션의 종료를 사용자나 다른 트랜잭션에게 알리는 단계이다.
이 단계에서는 트랜잭션 수행은 완료되었으나 변경 내용이 데이터베이스에 기록되어있는지 확실하지 않다.
찐 완료는 다른 트랜잭션이 데이터를 자유롭게 사용할 수 있다.
트랜잭션의 4가지 성질 (ACID)
1) 원자성 (Atomicity) : 트랜잭션에 포함된 작업은 전부 수행되거나 아니면 전부 수행되지 않아야 함
2) 일관성 (Consistency) : 트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관된 상태를 유지해야 함
3) 고립성 (Isolation) : 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하는 일이 없어야 함
4) 지속성 (Durability) : 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야함
2. 동시성 제어
동시성 제어
동시성 제어는
트랜잭션이 동시에 수행될 때, 일관성을 해치지 않도록 트랙잭션의 데이터 접근을 제어하는 DBMS의 기능이다.
동시성과 관련된 다양한 문제들이 있는데,
대표적인 예로 갱신손실(lost update), 오손읽기 (dirty read, uncommitted dependency), 반복불가능 읽기(non-repeatable read, inconsistent analysis), 유령데이터읽기(phantom read)가 있다.
차례대로 살펴보자.
갱신손실(lost update)은
두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생하는 문제 (write & write시)이다.
갱신손실은 절대로 허용되어서는 안되며, 락을 사용하면 데이터를 순차적으로 접근하여 처리를 진행함으로써 문제를 해결할 수 있다.
하지만 여기서도 데드락(deadlock)이 발생할 문제가 있다.
오손읽기 (dirty read, uncommitted dependency)는
읽기 작업을 하는 트랜잭션 1이 쓰기 작업을 하는 트랜잭션 2가 작업한 중간 데이터를 읽기 때문에 생기는 문제이다.
예를 들어, 중간에 ROLLBACK을 할 경우 트랜잭션 1은 무효가 된 데이터를 읽고 잘못된 결과를 도출하게 된다.
반복불가능 읽기(non-repeatable read, inconsistent analysis)는
트랜잭션 1이 데이터를 읽고 트랜잭션 2가 데이터를 쓰는 경우,
트랜잭션 1이 다시 데이터를 읽을 때 이전의 결과를 반복하지 않는 현상을 말한다.
유령데이터읽기(phantom read)는
트랜잭션 1이 데이터를 읽고 트랜잭션 2가 데이터를 쓰는 경우, 트랜잭션 1이 다시 데이터를 읽을 때 이전에 없던 데이터가 나타나는 현상
트랜잭션 고립수준 표준 명령어와 발생 현상
SQL 표준에서 네가지의 고립수준을 정의한다.
공통점은
LEVEL 0(READ UNCOMMITTED) ~ LEVEL 3(SERIALIZABLE)까지 공통적으로 UPDATE문에 배타락을 설정한다. (갱신손실문제)
차이점은 아래와 같다.
- LEVEL 0 : SELECT 문에 공유락을 걸지 않기 때문에 다른 트랜잭션에 내용을 그대로 읽음 ⇒ dirty page 데이터 읽음 (No Lock)
- LEVEL 1 : 데이터 읽는 동안 공유락 걸고 바로 해지
⇒ 다른 트랜잭션이 설정한 공유락 요청은 허용하나 배타락 요청은 허용 X
⇒ 하지만 바로 공유락을 해지하기 때문에 그 동안 배타락 사용 가능함 - LEVEL 2 : 공유락과 배타락을 트랜잭션이 종료할 때까지 유지
⇒ 트랜잭션이 자신의 데이터를 갱신할 수 없도록 함, 동시성이 낮아 특별한 상황이 아니라면 사용하지 않는 것이 좋음 - LEVEL 3: 완벽한 고립화 수준
⇒ 제한이 가장 심하고 데이터의 동시성도 가장 낮음
'Study > DB' 카테고리의 다른 글
[DB] Join과 인덱스 (2) | 2023.04.02 |
---|---|
[DB] 이상현상, 함수종속성, 정규화, 정규형 (0) | 2023.04.02 |
[DB] 관계데이터모델, 키(key), 무결성 제약조건 (0) | 2023.04.02 |
[DB] 데이터베이스 시스템이란? (0) | 2023.04.02 |