브래의 슬기로운 코딩 생활
데이터베이스 11주차 정리 본문
트랜잭션
트랜잭션의 개념
트랜잭션(transaction): DBMS에서 데이터를 다루는 논리적인 작업의 단위
트랜잭션은 전체가 수행되거나 또는 전혀 수행되지 않아야 함(all or nothing).
예)은행 업무를 보는데 A 계좌(박지성)에서 B 계좌(김연아)로 10,000원을 이체할 경우
트랜잭션 수행 과정
① A 계좌(박지성)의 값을 하드디스크(데이터베이스)에서 주기억장치 버퍼로 읽어온다
② B 계좌(김연아)의 값을 하드디스크(데이터베이스)에서 주기억장치 버퍼로 읽어온다.
③ A 계좌(박지성)에서 10,000원을 인출한 값을 저장한다.
④ B 계좌(김연아)에 10,000원을 입금한 값을 저장한다.
⑤ A 계좌(박지성)의 값을 주기억장치 버퍼에서 하드디스크(데이터베이스)에 기록한다.
⑥ B 계좌(김연아)의 값을 주기억장치 버퍼에서 하드디스크(데이터베이스)에 기록한다.
→ DBMS는 사용자에게 빠른 응답성을 보장하기 위해 [방법 1]을 선택한다.
트랜잭션의 성질 *
트랜잭션의 성질 – 원자성 (Atomicity)
트랜잭션의 성질 – 일관성 (Consistency)
트랜잭션의 성질 – 고립성 (Isolation)
데이터베이스는 공유가 목적이므로 여러 트랜잭션이 동시에 수행됨
고립성을 유지하기 위해서는 트랜잭션이 변경 중인 임시 데이터를 다른 트랜잭션이 읽고 쓸 때 제어가 필요함
= 동시성 제어
트랜잭션의 성질 – 지속성 (Durability)
트랜잭션이 정상적으로 완료(commit) 혹은 부분완료(partial commit)한 데이터는 DBMS가 책임지고
데이터베이스에 기록하는 성질
버퍼내용 기록 전에 시스템 다운 등으로 실패하면 트랜잭션이 수행한 작업을 모두 원상복구한다
= 회복
트랜잭션의 성질
DBMS는 트랜잭션의 성질을 유지하기 위해 다음 기능들을 수행
동시성 제어
동시성 제어
동시성 제어(concurrency control) : 트랜잭션이 동시에 수행될 때, 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 DBMS의 기능
같은 데이터를 접근하는 두 트랜잭션의 작업(읽기, 쓰기)에 따라 발생하는 상황
위 [상황 3]을 '갱신손실 문제 (LOST UPDATE)'라고 하며
두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신(update)할 때 발생하며,
데이터베이스에서 절대 발생하면 안 되는 현상
갱신손실 문제
락
- 갱신손실 문제를 해결하려면 상대방 트랜잭션이 데이터를 사용하는지 여부를 알 수 있는 규칙이 필요함
- 데이터를 수정이 순차적으로 진행되므로 갱신손실 문제를 해결할 수 있다
락 유형
공유락과 배타락을 사용하는 규칙
2단계 락킹
2단계 락킹 기법 :
락을 걸고 해제하는 시점에 제한을 두지 않으면 두 개의 트랜잭션이 동시에 실행될 때
데이터의 일관성이 깨질 수 있어 이를 방지하는 방법
데드락
두 개 이상의 트랜잭션이 각각 자신의 데이터에 대하여 락을 획득하고 상대방 데이터에 대해 락을 요청하면 무한 대기 상태에 빠질 수 있는 현상으로, 교착상태라고도 함
트랜잭션 고립 수준
트랜잭션 고립 수준
오손 읽기 (Dirty Read)
- 읽기 작업을 하는 트랜잭션 1이 쓰기 작업을 하는 트랜잭션 2가 작업한 중간 데이터를 읽기 때문에 생기는 문제
- 작업 중인 트랜잭션 2가 어떤 이유에서 작업을 철회(ROLLBACK)할 경우
트랜잭션 1은 무효가 된 데이터를 읽게 되고 잘못된 결과를 도출하는 현상
반복불가능 읽기 (Non-Repeatable Read)
- 트랜잭션 1이 데이터를 읽고 트랜잭션 2가 데이터를 쓰고(갱신, UPDATE)
트랜잭션 1이 다시 한 번 데이터를 읽을 때 생기는 문제
유령데이터 읽기 (Phantom Read)
- 트랜잭션 1이 읽기 작업을 다시 한 번 반복할 경우 이전에 없던 데이터(유령 데이터)가 나타나는 현상
트랜잭션 고립 수준 명령어 (Transaction Isolation Level Instruction)
DBMS는 트랜잭션을 동시에 실행시키면서 락보다 좀 더 완화된 방법으로 문제를 해결하기 위해 제공하는 명령어
트랜잭션 고립 수준 명령어와 발생 현상
회복
회복
데이터베이스에 장애가 발생했을 때 데이터베이스를 일관성 있는 상태로 되돌리는 DBMS의 기능
트랜잭션과 회복
- 트랜잭션은 변경 내용을 한순간에 모두 기록하지 않는다.
로그 파일
- 트랜잭션이 수행 중이거나 수행이 종료된 후 발생하는 데이터베이스 손실을 방지하기 위해
트랜잭션의 데이터베이스 기록을 추적하는 로그 파일(log file)을 사용함
<트랜잭션번호, 로그의 타입, 데이터 항목 이름, 수정 전 값, 수정 후 값>
로그 파일을 이용한 회복
데이터의 변경 기록을 저장해 둔 로그 파일을 이용하면 시스템 장애도 복구할 수 있음
아래 두 개의 트랜잭션이 실행된다고 하자.
편의상 트랜잭션의 연산 SELECT, UPDATE는 read_item( ), write_item( )으로 대체한다.
트랜잭션은 각각 데이터 A, B, C, D를 읽거나 쓰는 작업을 진행한다.
데이터(A, B, C, D)의 초깃값은 (100, 200, 300, 400)이다.
트랜잭션이 T1 → T2 순으로 실행된다면 다음과 같은 로그 파일이 생성된다
- 시스템 운영 중 장애가 발생하여 시스템이 다시 가동되었을 때 DBMS는 로그 파일을 먼저 살펴본다.
장애가 발생한 후 시스템을 다시 가동 했을 때, 로그 파일에 트랜잭션 시작(START)이 있고 종료(COMMIT)가 있는 경우다. COMMIT 연산이 로그에 있다는 것은 트랜잭션이 모두 완료되었다는 의미다. 다만 변경 내용이 버퍼에서 데이터베이스에 기록되지 않았을 가능성이 있다. 따라서 로그를 보면서 트랜잭션이 변경한 내용을 데이터베이스에 다시 기록하는 과정이 필요하다. 이 과정을 REDO라고 한다.
장애가 발생한 후 시스템을 다시 가동했을 때, 로그 파일에 트랜잭션의 시작(START)만 있고 종료(COMMIT)가 없는 경우다. COMMIT 연산이 로그에 보이지 않는다는 것은 트랜잭션이 완료되지 못했다는 의미로, 트랜잭션이 한 일을 모두 취소해야 한다. 이 경우 완료하지 못했지만 버퍼의 변경 내용이 데이터베이스에 기록되어 있을 가능성이 있기 때문에 로그를 보면서 트랜잭션이 변경한 내용을 데이터베이스에서 원상복구시켜야 한다. 이 과정을 UNDO라고 한다.
- 즉시 갱신 방법
지연 갱신(deferred update)은 ‘갱신 데이터→로그’가 끝난 후 부분완료를 하고
‘버퍼→데이터베이스’ 작업이 진행되는 방법
'2-1 > 데이터베이스' 카테고리의 다른 글
데이터베이스 13주차 정리 (2) | 2023.06.03 |
---|---|
데이터베이스 12주차 정리 (0) | 2023.05.22 |
데이터베이스 10주차 정리 (0) | 2023.05.08 |
데이터베이스 7주차 정리 (0) | 2023.04.17 |
데이터베이스 중간고사 정리 (0) | 2023.04.16 |