득이공간

[데이터베이스] 9장. 트랜잭션 본문

CS/DB

[데이터베이스] 9장. 트랜잭션

쟁득 2024. 2. 27. 09:46
해당 게시물은 김태연 교수님의 '데이터베이스' 강의를 수강하며
학습한 내용을 개인적으로 정리한 글입니다.

📌 목차 - 9장. 트랜잭션

9-1. 트랜잭션 개요
9-2. 동시성 제어
9-3. 회복
9-4. PL/SQL의 트랜잭션


📌 9-1. 트랜잭션 개요

* 트랜잭션(transaction)
- 기본적으로 각각의 SQL문이 하나의 트랜잭션으로 취급된다.
- 대규모 데이터베이스를 수백, 수천 명 이상의 사용자들이 동시에 접근한다. (항공기 예약, 은행, 신용 카드 처리, 대형 할인점 등)
- 동시성 제어(concurrency control) : 다수 사용자가 데이터베이스를 동시에 접근하도록 허용하면서 데이터베이스의 일관성을 유지한다.
- 회복(recovery) : 데이터베이스를 갱신하는 도중에 시스템이 고장 나도 데이터베이스의 일관성을 유지한다.
- 로그(log) 유지 : DBMS가 추가로 정보를 유지하지 않는다면 DBMS가 재기동된 후에 어느 직원의 튜플까지 수정되었는가를 알 수 없다.


* 트랜잭션의 특성 (ACID 특성)
- 원자성(Atomicity): 한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않음(all or nothing)을 의미한다.
- 일관성(Consistency): 어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스는 또 다른 일관된 상태를 가진다. 데이터베이스의 일시적인 불일치 상태 (트랜잭션 수행중)
- 고립성(Isolation): 한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신 중인 데이터를 다른 트랜잭션들이 접근하지 못하도록 해야 한다. DBMS는 다양한 고립 수준(isolation level)을 제공한다.
- 지속성(Durability): 일단 한 트랜잭션이 완료되면 이 트랜잭션이 갱신한 것은 그 후에 시스템에 고장이 발생하더라도 손실되지 않는다.


* 트랜잭션의 완료(commit) / COMMIT WORK
- 트랜잭션에서 변경하려는 내용이 데이터베이스에 완전하게 반영된 것


* 트랜잭션의 철회(abort) / ROLLBACK WORK
- 트랜잭션에서 변경하려는 내용이 데이터베이스에 일부만 반영된 경우에는 원자성 보장을 위해서 수행되기 전의 상태로 되돌린다.


* 트랜잭션이 성공하지 못하는 원인
- 시스템(사이트) 고장, 트랜잭션 고장, 매체 고장, 통신 고장, 자연적 재해, 부주의 또는 고의적인 고장


📌 9-2. 동시성 제어

* 동시성 제어
- 대부분의 DBMS들은 다수 사용자용이다.
- 여러 사용자들이 다수의 트랜잭션들을 동시에 수행하는 환경에서 부정확한 결과를 생성할 수 있는, 트랜잭션들 간의 간섭이 생기지 않도록 한다.


* 직렬 스케줄(serial schedule)

- 여러 트랜잭션들의 집합을 한 번에 한 트랜잭션씩 차례대로 수행한다.


* 비직렬 스케줄(non-serial schedule)

- 여러 트랜잭션들을 동시에 수행한다.


* 직렬가능(serializable)

- 비직렬 스케줄의 결과가 어떤 직렬 스케줄의 수행 결과와 동등하다.


* 데이터베이스 연산
- Input(X)
- Output(X)
- read_item(X)
- write_item(X)


* 동시성 제어 없이 다수의 트랜잭션을 동시에 수행할 때 생길 수 있는 문제
- 갱신 손실(lost update) : 수행 중인 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어 씀으로써 갱신이 무효가 되는 것
- 오손 데이터 읽기(dirty read) : 완료되지 않은 트랜잭션이 갱신한 데이터를 읽는 것
- 반복할 수 없는 읽기(unrepeatable read) : 한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽는 것


* 로킹(locking)
- 동시에 수행되는 트랜잭션들의 동시성을 제어하기 위해서 가장 널리 사용되는 기법이다.
- 트랜잭션에서 데이터 항목을 접근할 때 lock을 요청하고 접근을 끝낸 후에 unlock한다.
- 갱신(쓰기) 목적 접근 : 독점 로크(X-lock, eXclusive lock)
- 판독(읽기) 목적 접근 : 공유 로크(S-lock, Shared lock)


* 2단계 로킹 프로토콜(2-phase locking protocol)
- 로크를 요청하는 것과 로크를 해제하는 것이 2단계로 이루어진다.
- 로크 확장 단계 (1단계) : 트랜잭션이 데이터 항목에 대해서 새로운 로크를 요청할 수 있다.
- 로크 수축 단계 (2단계) : 보유하고 있던 로크를 해제할 수 있다. 일반적으로 한번에 해제하는 방식이 사용된다. 롤백 문제가 있을 수 있기 때문이다.
- 로크 포인트(lock point) : 한 트랜잭션에서 필요로 하는 모든 로크를 걸어놓은 시점


* 데드락(deadlock)

- 두 개 이상의 트랜잭션들이 서로 상대방이 보유하고 있는 로크를 요청하면서 기다리고 있는 상태. 이를 해결하기 위해서는 희생자를 선정해서 데드락을 푸는 기법을 사용한다.


* 다중 로크 단위(multiple granularity)

- 한 트랜잭션에서 로크할 수 있는 데이터 항목이 두 가지 이상 있으면 다중 로크 단위라고 한다.
- 로크 단위가 작을수록 로킹에 따른 오버헤드가 증가한다.
- 로크 단위가 작을수록 동시성의 정도는 증가한다.


* 팬텀 문제(phantom problem)

- 로크를 걸었음에도 로크 단위가 작아서 테이블의 결과가 다르게 나오는 상황

- 로크 단위를 크게 해서 이를 해결할 수 있다.


📌 9-3. 회복

* 회복의 필요성
- 어떻게 T의 수행을 취소해서 원자성을 보장할 것인가?
- 어떻게 T의 수행 결과가 데이터베이스에 완전하게 반영되도록 해서 지속성을 보장할 것인가?
- 로그에 저장.


* 회복의 개요
- 재수행(REDO) : 고장이 발생하기 전에 트랜잭션이 완료 명령을 수행했다면 회복 모듈은 이 트랜잭션의 갱신 사항을 재수행해서 트랜잭션의 갱신이 지속성을 갖도록 해야 한다.
- 취소(UNDO) : 고장이 발생하기 전에 트랜잭션이 완료 명령을 수행하지 못했다면 원자성을 보장하기 위해서 이 트랜잭션이 데이터베이스에 반영했을 가능성이 있는 갱신 사항을 취소해야 한다.


* 안전 저장 장치(stable storage)

- 모든 유형의 고장을 견딜 수 있는 저장 장치


* 재해적 고장과 비재해적 고장
- 재해적 고장 : 데이터베이스를 백업해 놓은 자기 테이프
- 비재해적 고장 : 로그를 기반으로 한 즉시 갱신, 로그를 기반으로 한 지연 갱신, 그림자 페이징(shadow paging) 등 여러 알고리즘


* 로그를 사용한 즉시 갱신
- 원자성과 지속성을 보장하기 위해서 DBMS는 로그(log)를 유지한다.
- 데이터베이스의 항목에 영향을 미치는 모든 트랜잭션의 연산들에 대해서 로그 레코드를 기록한다.
- 각 로그 레코드는 로그 순서 번호(LSN: Log Sequence Number)로 식별된다.
- 이중 로그(dual logging) : 로그를 두 개의 디스크에 중복해서 저장하는 것


* 로그 레코드의 유형
- Trans-ID, start : 한 트랜잭션이 생성될 때 기록되는 로그 레코드
- Trans-ID, X, old_value, new_value : 주어진 Trans_ID를 갖는 트랜잭션이 데이터 항목 X를 이전 값에서 새로운 값으로 수정했음을 나타내는 로그 레코드
- Trans-ID, commit : 갱신 완료
- Trans-ID, abort : 철회


* 트랜잭션의 완료점(commit point)

- 한 트랜잭션의 데이터베이스 갱신 연산이 모두 끝나고 데이터베이스 갱신 사항이 로그에 기록되었을 때


* 로그 먼저 쓰기(WAL: Write-Ahead Logging)

- 트랜잭션이 데이터베이스를 갱신하면 데이터베이스 버퍼보다 로그 버퍼를 먼저 디스크에 기록해야 한다.


* 체크포인트(checkpoint) 필요성

- DBMS는 회복시 재수행할 트랜잭션의 수를 줄이기 위해서 주기적으로 체크포인트를 수행한다.


* 체크포인트를 할 때 수행되는 작업
- 수행 중인 트랜잭션들을 일시적으로 중지시킨다.
- 주기억 장치의 로그 버퍼를 디스크에 강제로 출력한다.
- 주기억 장치의 데이터베이스 버퍼를 디스크에 강제로 출력한다.
- [checkpoint] 로그 레코드를 로그 버퍼에 기록한 후 디스크에 강제로 출력한다.
- 체크포인트 시점에 수행 중이던 트랜잭션들의 ID도 [checkpoint] 로그 레코드에 함께 기록한다.
- 일시적으로 중지된 트랜잭션의 수행을 재개한다.


* 점진적인 백업(incremental backup)

- 사용자들에게 데이터베이스 사용을 계속 허용하면서, 지난 번 백업 이후에 갱신된 내용만 백업을 한다.


📌 9-4. PL/SQL의 트랜잭션

* 트랜잭션의 시작과 끝
- COMMIT문 : 현재의 트랜잭션을 완료
- ROLLBACK문 : 현재의 트랜잭션을 철회
- SAVEPOINT문 : 현재의 트랜잭션 내의 저장점을 표시
- ROLLBACK TO SAVEPOINT문 : 현재의 트랜잭션에서 지정된 저장점 이후에 갱신된 내용을 철회


* 고립 수준에 따른 동시성 문제
- READ UNCOMMITTED : 오손데이터읽기, 반복할수없는읽기, 팬텀문제
- READ COMMITTED : 반복할수없는읽기, 팬텀문제
- REPEATABLE READ : 팬텀문제
- SERIALIZABLE : X