12장: 트랜잭션 관리

트랜잭션: 데이터베이스의 일의 단위

동시성 제어: 다수 사용자가 데이터베이스를 동시에 접근하도록 허용하면서 데이터베이스의 일관성을 유지함, 여러 사용자나 여러 응용 프로그램들이 동시에 수행되어도 서로 간접하지 못하도록 보장함

회복: 시스템이 고장 나도 데이터베이스의 일관성을 유지함

일관성 유지의 예시: 모든 사원의 월급이 100만원이면 각 사원의 월급 통장에는 100만원씩 들어와야 함 / 두 사람 간 거래를 하면 한 사람이 돈이 늘어난 양과 다른 사람이 돈이 줄어든 양은 일치해야 함


트랜잭션의 예: 계좌 이체

A라는 사람이 B라는 사람에게 계좌 이체를 하면 A의 잔고를 줄이고 B의 잔고를 늘려야 한다.

(2개의 update문이 1개의 transaction)

<두 update문의 순서는 중요하지 않음>

첫 번째 update문을 수행한 후에 두 번째 update문을 수행하기 전에 컴퓨터 시스템이 다운되면 재가동 후에 DBMS가 어떻게 대응해야 하는가?

-> update문이 둘 다 완전하게 수행되거나 둘 다 수행되지 않도록 DBMS가 보장해야 함


트랜잭션의 특성 (ACID)

A: 원자성 – 한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않아야 한다.

C: 일관성 – 어떤 트랜잭션이 수행되기 전에 일관된 상태를 가졌다면 트랜잭션이 수행된 후에도 일관된 상태를 가져야 한다.

I: 고립성 – 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신 중인 데이터를 다른 트랜잭션들이 접근하지 못하도록 해야 함

D: 지속성 – 한 트랜잭션이 완료되면 이 트랜잭션이 갱신한 것은 그 후에 시스템에 고장이 발생하더라도 손실되지 않음

트랜잭션의 완료: 트랜잭션에서 변경하려는 내용이 데이터베이스에 완전하게 반영됨 (commit)

트랜잭션의 철회: 트랜잭션에서 변경하려는 내용이 일부만 반영한 경우 원자성을 보장하기 위해서, 트랜잭션이 갱신한 사항을 트랜잭션이 수행되기 전의 상태로 되돌림 (Rollback)

트랜잭션이 성공하지 못하는 원인

: 시스템 고장(cpu 고장), 트랜잭션 고장(입력 데이터 불량), 매체 고장 (디스크 고장), 통신 고장 등


동시성 제어

여러 사용자나 여러 응용 프로그램들이 동시에 수행되어도 서로 간접하지 못하도록 보장함

직렬 스케줄: 여러 트랜잭션들의 집합을 한 번에 한 트랜잭션씩 차례대로 수행함
비직렬 스케줄: 여러 트랜잭션들을 동시에 수행함
직렬 가능: 비직렬 스케줄의 결과가 어떤 직렬 스케줄의 수행 결과가 동등하게 함


데이터베이스 연산

INPUT: 데이터베이스 -> RAM
OUTPUT: RAM -> 데이터베이스
READ: RAM -> 응용 프로그램의 변수
WRITE: 응용 프로그램의 변수 -> RAM


동시성 제어를 하지 않으면?

1. 갱신 손실
: a트랜잭션이 갱신한 내용을 b트랜잭션이 덮어씀으로써 무효가 됨  

2. 오손 데이터 읽기
: 트랜잭션이 완료되기 전에 데이터를 읽어서 완료된 시점에서는 잘못된 값을 읽게 됨

3. 반복할 수 없는 읽기
: 한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽음


로킹

동시에 수행되는 트랜잭션들의 동시성을 제어하기 위해 사용되는 기법

데이터베이스 내의 모든 데이터 항목마다 로크(락)이 존재함

독점 로크: 트랜잭션이 갱신을 목적으로 데이터 항목을 접근할 때 독점 락을 요청함

공유 로크: 트랜잭션에서 읽을 목적으로 데이터 항목을 접근할 때 공유 락을 요청함

공유 락을 갖고 있다. (읽는 중이다) 근데 공유 락을 요청한다. (읽으려 한다) 그럼 허용한다.

독점 락을 갖고 있다. (갱신 중이다) 근데 공유 락을 요청한다. (읽으려 한다) 그럼 대기한다.

공유 락을 갖고 있다. (읽는 중이다) 근데 독점 락을 요청한다. (갱신하려 한다) 그럼 대기한다.

독점 락을 갖고 있다. (갱신 중이다) 근데 독점 락을 요청한다. (갱신하려 한다) 그럼 대기한다.

락이 걸려있지 않으면 요청 중인 락을 허용한다.


2단계 로킹 프로토콜

1. 로크를 요청 / 로크를 해제하는 것이 2단계로 이루어짐

(1단계) 로크 확장 단계

새로운 락을 요청할 수 있음, 갖고 있던 락을 해제할 수 없음

(2단계) 로크 수축 단계

갖고 있던 락을 해제할 수 있음, 새로운 락을 요청할 수는 없음

필요로 하는 모든 락을 획득하였을 때: 로크 포인트

올라가는 모양은 락을 계속 요청하는 것(확장)

내려가는 모양은 락을 계속 해제하는 것(수축) // 한 번에 해제 가능


데드록

2단계 로킹 프로토콜에서는 데드록(교착 상태)이 발생할 수 있음

/ 두 개 이상의 트랜잭션들이 서로 상대방이 보유하고 있는 로크를 요청하면서 기다리고 있는 상태


다중 로크 단위

소수의 투플을 접근할 때는 락 단위를 작게 하고 대부분의 투플을 접근할 때는 락 단위를 크게 한다. 락의 단위로는 데이터베이스,릴레이션,디스크블록,투플 등이 있음

락 단위가 작을수록 오버헤드는 증가한다. (락-언락-락-언락-… 많은 일이 필요)

락 단위가 작을수록 동시성의 정도는 증가한다. (락이 걸려있지 않은 많은 다른 투플 접근 허용)

-> 해야할 일은 많지만 동시성에는 좋다.

두 트랜잭션이 동시에 수행될 수 있음 (락 단위가 투플이기 때문)

트랜잭션 T1이 락을 풀 때까지 기다려야 한다.


회복

데이터베이스를 장애바랭 이전의 일관된 상태(오류가 없는 상태)로 복원시키는 것

회복의 기본원리: 중복(redundancy)

덤프: 다른 저장장치로 복제

로그: 데이터 아이템의 옛 값과 새 값을 별도의 파일에 기록

회복을 위한 조치

Redo: 재수행

가장 최근 복제본(옛 값)+로그(새 값)->데이터베이스 복원

[트랜잭션 완료하자마자 고장나면 redo(지속성을 위해)]

Ubdo: 없던 일로 함

로그(옛 값)+모든 변경들을 취소->원래의 데이터베이스 상태로 복원

[트랜잭션 완료 전 고장나면 undo(원자성을 위해)]

로그

이중 로그: 로그를 두 개의 디스크에 중복해서 저장하는 것                    

로그 레코드는 로그 순서 번호로 식별되고, 동일한 트랜잭션에 속하는 로그 레코드들을 연결 리스트로 유지됨

로그 우선 기록 규약

트랜잭션이 갱신한 데이터 항목을 디스크에 저장된 데이터베이스에 기록하기 전 로그 레코드에 먼저 기록함

로그를 사용한 즉시 갱신 (완료 전 갱신 가능)

(데이터베이스에는 완료된 트랜잭션의 수행 결과뿐만 아니라 철회된 트랜잭션의 수행 결과도 반영 될 수 있음)


로그를 사용한 지연 갱신 (완료돼야 갱신 가능)

undo연산이 필요 없음, 로그 레코드 old-value불필요

[완료 전에는 갱신하지 않아 기존 값이 남아 있음]


체크포인트

주기억장치의 데이터베이스 버퍼 내용을 디스크에 기록 – 체크 포인트

(체크포인트한 시점 이전에 완료된 트랜잭션 결과를 디스크에 기록한다) 체크 포인트 작업이 끝나면 [checkpoint] 로그 레코드가 기록됨

[체크포인트 하지 않았을 때]

T1~T3는 완료되었지만 디스크에 기록되었는지 DBMS가 알 수 없음
-> T1,T2,T3는 완료된 명령이니 REDO
-> T4는 완료 전이니 UNDO

[체크포인트 하였을 때]

트랜잭션 T1은 체크 포인트 이전에 수행이 완료되었으므로 이미 로그 버퍼와 데이터베이스 버퍼가 디스크에 반영됨

T2~T3는 완료 되었지만 반영되었는지 알 수 없음

-> T1은 이미 디스크에 기록되었으니 무시
-> T2,T3는 완료된 명령이니 REDO
-> T4는 완료 전이니 UNDO


점진적인 백업: 사용자들에게 데이터베이스 사용을 계속 허용하면서, 지난 번 백업 이후에 갱신된 내용만 백업을 하는 것 (전체 데이터베이스를 백업하는 것은 너무 오래 걸리니 조금씩 백업)

과정: 사용(갱신)->백업->사용(갱신)->백업->….

One thought on “12장: 트랜잭션 관리

Leave a Reply

Your email address will not be published. Required fields are marked *