
01. 트랜잭션
트랜잭션(Transaction)의 개념
- 하나의 작업을 수행하는데 필요한 데이터베이스 연산들을 모아놓은 것
 - 논리적인 작업의 단위
 - 작업 수행에 필요한 SQL 문들의 모임
- 특히, 데이터베이스를 변경하는 INSERT, DELETE, UPDATE 문의 실행을 관리
 
 - 장애 발생 시 복구 작업이나 병행 제어 작업을 위한 중요한 단위로 사용됨
 - 데이터베이스의 무결성과 일관성을 보장하기 위해 작업 수행에 필요한 연산들을 하나의 트랜잭션으로 제대로 정의하고 관리해야 함
 



트랜잭션의 특성 – 원자성(Atomicity)
- 트랜잭션의 연산들이 모두 정상적으로 실행되거나
하나도 실행되지 않아야 하는 all-or-nothing 방식을 의미 - 만약 트랜잭션 수행 도중 장애가 발생하면
- 지금까지 실행한 연산 처리를 모두 취소하고
 - 데이터베이스를 트랜잭션 작업 전 상태로 되돌려야 함
 
 - 원자성의 보장을 위해
장애 발생 시 회복 기능이 필요 

트랜잭션의 특성 – 일관성(Consistency)
- 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 함을 의미
 

트랜잭션의 특성 – 격리성(Isolation)
- 수행 중인 트랜잭션이 완료될 때까지, 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없음을 의미
 - 격리성을 보장하려면, 여러 트랜잭션이 동시에 수행되더라도 마치 순서대로 하나씩 수행되는 것처럼
정확하고 일관된 결과를 얻을 수 있도록 제어하는 기능이 필요 

트랜잭션의 특성 – 지속성(Durability)
트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 영구적이어야 함을 의미한다.
지속성의 보장을 위해서는 장애 발생 시 회복 기능이 필요하다.


트랜잭션의 주요 연산 – Commit 연산
• 트랜잭션의 수행이 성공적으로 완료되었음을 선언하는 연산이다.
• Commit 연산이 실행되면 트랜잭션의 수행 결과가 데이터베이스에 반영되고, 일관된 상태를 지속적으로 유지하게 된다.

트랜잭션의 주요 연산 – Rollback 연산
• 트랜잭션의 수행이 실패했음을 선언하는 연산이다.
• Rollback 연산이 실행되면 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고, 데이터베이스가 트랜잭션 수행 전의 일관된 상태로 되돌아간다.


트랜잭션의 상태
• 활동 (active)
트랜잭션이 수행되기 시작하여 현재 수행 중인 상태
• 부분 완료 (partially committed)
트랜잭션의 마지막 연산이 실행을 끝낸 직후의 상태
• 완료 (committed)
트랜잭션이 성공적으로 완료되어 commit 연산을 실행한 상태
트랜잭션이 수행한 최종 결과를 데이터베이스에 반영하고,
데이터베이스가 새로운 일관된 상태가 되면서 트랜잭션이 종료됨
• 실패 (failed)
장애가 발생하여 트랜잭션의 수행이 중단된 상태
• 철회 (aborted)
트랜잭션의 수행 실패로 rollback 연산을 실행한 상태
지금까지 실행한 트랜잭션의 연산을 모두 취소하고,
트랜잭션이 수행되기 전의 데이터베이스 상태로 되돌리면서 트랜잭션이 종료됨
철회 상태로 종료된 트랜잭션은 상황에 따라 다시 수행되거나 폐기됨
02. 장애와 회복
장애(failure) : 시스템이 제대로 동작하지 않는 상태


트랜잭션의 수행을 위해 필요한 데이터 이동 연산
- 디스크와 메인 메모리 간의 데이터 이동 연산: input / output
 - 메인 메모리와 프로그램 변수 간의 데이터 이동 연산 : read / write
 

디스크와 메인 메모리 간 데이터 이동 연산
• 일반적으로 데이터베이스는 비휘발성 저장 장치인 디스크에 상주
• 트랜잭션이 데이터베이스의 데이터를 처리하기 위해서는, 데이터를 디스크에서 메인 메모리로 가져와 처리한 후, 그 결과를 다시 디스크로 보내는 작업이 필요
- input 연산 / output 연산
 - 블록(block) 단위로 수행됨
 

메인 메모리와 변수 간의 데이터 이동 연산
- Read 연산 / Write 연산
• 응용프로그램에서 트랜잭션 수행을 지시하면,
메인 메모리의 버퍼 블록에 있는 데이터를 프로그램의 변수로 가져오고,
처리 결과를 저장한 변수 값을 다시 버퍼 블록으로 옮기는 작업이 필요함 


회복 (Recovery)
• 장애가 발생했을 때, 데이터베이스를 장애 발생 이전의 일관된 상태로 복구시키는 것
• 트랜잭션의 특성을 보장하고 데이터베이스의 일관성을 유지하기 위해 필수적인 기능
• **회복 관리자 (Recovery Manager)**가 담당
- 장애 발생을 탐지하고, 탐지되면 데이터베이스 복구 기능을 제공
 


로그 파일
- 데이터를 변경하기 이전의 값과 변경한 이후의 값을 기록한 파일
 - 레코드 단위로 트랜잭션 수행과 함께 기록됨
 



로그 회복 기법 – 즉시 갱신 (Immediate Update)
- 개념
• 트랜잭션 수행 중에 데이터 변경 연산의 결과를 데이터베이스에 즉시 반영 - 로그 기록 방식
• 장애에 대비해 데이터 변경 내용을 로그 파일에 기록
• 변경 연산이 실행되면, 먼저 로그 레코드를 기록한 후 데이터베이스에 변경 내용을 반영 - 복구 방식
• 장애 발생 시점에 따라 다음 연산 수행- Redo: 트랜잭션의 결과를 다시 반영
 - Undo: 트랜잭션의 결과를 취소
 
 


로그 회복 기법 –즉시 갱신회복 기법 적용 예


로그 회복 기법 – 지연 갱신 (Deferred Update)
- 개념
• 트랜잭션 수행 중에는 데이터 변경 결과를 로그에만 기록
• 트랜잭션이 부분 완료된 후, 로그에 기록된 내용을 데이터베이스에 한 번에 반영 - 복구 특성
• 트랜잭션 수행 중 장애 발생 시, 로그에 기록된 내용을 버리기만 하면 됨
→ 데이터베이스는 원래 상태 유지됨 - 복구 연산
• Undo 연산은 불필요
• Redo 연산만 사용 - 로그 레코드 형식
• 변경 이후 값만 기록
• 예: <T1, X, new_value> 


검사 시점 회복 기법 (Checkpoint Recovery)
- 기본 개념
• 로그 기록을 이용하되, 일정 시간 간격으로 **검사 시점(checkpoint)**을 설정
• 검사 시점마다 다음 작업을 수행- 모든 로그 레코드를 로그 파일에 기록
 - 데이터 변경 내용을 데이터베이스에 반영
 - <checkpoint L> 로그 레코드 기록 (L은 현재 실행 중인 트랜잭션 리스트)
 
 - 장애 발생 시 회복 범위
• 가장 최근의 <checkpoint L> 이후에만 회복 작업 수행
• <checkpoint> 이전 트랜잭션은 회복 대상에서 제외됨 - 회복 수행 방식
• 회복 작업은 즉시 갱신 또는 지연 갱신 기법을 이용해 수행 - 장점 (효율성 향상)
• 로그 전체를 대상으로 회복할 때 발생하는 비효율성 해소
• 검사 시점 기준으로 작업 범위가 정해지므로,
→ 불필요한 회복 연산 없이 시간 절약 
미디어 회복 기법 (Media Recovery)
- 목적
• 디스크에 발생할 수 있는 물리적 장애에 대비한 회복 기법 - 방식
• 덤프(backup) 이용- 전체 데이터베이스의 내용을
일정 주기마다 다른 안전한 저장 장치에 복사 
 - 전체 데이터베이스의 내용을
 - 장애 발생 시 처리
• 디스크에 장애가 발생하면,- 가장 최근에 복사해둔 덤프를 이용해 복구
 - 복구 이후, 필요에 따라 redo 연산 수행
→ 로그를 참고하여 최신 상태로 복원 
 
03. 병행 제어
병행 수행 (Concurrency)
- 정의
• 여러 사용자가 데이터베이스를 동시에 공유할 수 있도록 여러 개의 트랜잭션을 동시에 수행하는 것 - 수행 방식
• 여러 트랜잭션이 차례로 번갈아 수행되는 인터리빙(interleaving) 방식으로 실행됨 
병행 제어 (Concurrency Control) 또는 동시성 제어
- 정의
• 병행 수행 시 같은 데이터에 접근하여 연산을 실행하더라도, 문제가 발생하지 않고 정확한 수행 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 기법 
병행 수행 시 발생할 수 있는 문제점 – 갱신 분실 (Lost Update)
- 정의
• 하나의 트랜잭션이 수행한 데이터 변경 연산의 결과가, 다른 트랜잭션에 의해 덮어써져 무효화되는 현상 - 해결 관점
• 여러 트랜잭션이 동시에 수행되더라도, 갱신 분실 문제가 발생하지 않아야 하며, 마치 트랜잭션들을 순차적으로 수행한 것과 같은 결과를 얻을 수 있어야 함. 



병행 수행 시 발생할 수 있는 문제점 – 연쇄 복귀 (Cascading Rollback)
- 정의
• 트랜잭션이 완료되기 전에 장애가 발생하여 rollback을 수행하면, 이 트랜잭션이 변경한 데이터를 사용한 다른 트랜잭션들도 함께 rollback을 수행해야 하는 상황이 발생하는 것 - 해결 관점
• 여러 트랜잭션이 동시에 수행되더라도, 연쇄 복귀 문제가 발생하지 않아야 하며, 마치 트랜잭션들을 순차적으로 수행한 것과 같은 결과를 얻을 수 있어야 함 

트랜잭션 스케줄 : 트랜잭션에 포함되어 있는 연산들을 수행하는 순서

직렬 스케줄 (Serial Schedule)
- 의미
• 인터리빙(interleaving) 없이
각 트랜잭션의 연산을 순차적으로 하나씩 실행하는 방식 - 특징
• 트랜잭션이 서로 방해받지 않고 독립적으로 수행되므로 항상 모순이 없는 정확한 결과를 얻을 수 있음
• 다양한 직렬 스케줄이 존재할 수 있으며, 각각의 최종 결과는 다를 수 있으나 모두 일관성과 정확성을 보장함
• 각 트랜잭션을 독립적으로 수행하므로 병행 수행이라고 볼 수 없음 

비직렬 스케줄 (Non-Serial Schedule)
- 의미
• 인터리빙(interleaving) 방식을 이용하여 여러 트랜잭션을 동시에 병행 수행하는 것 - 특징
• 트랜잭션이 번갈아 연산을 실행하므로, 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션의 연산이 실행될 수 있음
• 병행 수행 과정에서 갱신 분실, 모순성, 연쇄 복귀 등의 문제가 발생할 수 있어 결과의 정확성을 보장할 수 없음
• 다양한 비직렬 스케줄이 존재하며, 그 중 일부는 잘못된 결과를 생성할 수 있음 

직렬 가능 스케줄 (Serializable Schedule)
- 의미
• 직렬 스케줄과 동일한 결과를 생성하는 비직렬 스케줄
• 즉, 수행 결과가 동일한 직렬 스케줄이 존재하는 비직렬 스케줄 - 특징
• 인터리빙 방식으로 병행 수행하면서도 정확하고 일관된 결과를 얻을 수 있음
• 직렬 가능 스케줄인지의 판단은 복잡하고 어려운 작업이므로, 일반적으로는 직렬 가능성을 보장하는 병행 제어 기법을 사용하여 구현함 

병행 제어 기법
- 의미
• 병행 수행 중에도 **직렬 가능성(serializability)**을 보장하기 위한 기법 - 방법
• 모든 트랜잭션이 직렬 가능성을 보장하는 규약을 따르도록 설계
• 트랜잭션들이 규약을 정확히 준수하면, 결과는 항상 정확함 - 대표 기법
• 로킹(Locking) 기법 
로킹(Locking) 기법
■ 기본 원리
• **상호 배제(mutual exclusion)**를 기반으로 함
• 한 트랜잭션이 특정 데이터에 접근하면, 그 연산이 끝날 때까지 다른 트랜잭션이 접근하지 못하도록 제어
■ lock / unlock 연산
• lock: 트랜잭션이 데이터에 대한 독점권을 요청하는 연산
• unlock: 트랜잭션이 독점권을 반환하는 연산
■ 기본 로킹 규약
• 트랜잭션은 read 또는 write 연산 전에 반드시 lock을 선행해야 함
• 이미 lock된 데이터에는 다른 트랜잭션이 중복해서 lock 불가능
• 모든 연산이 끝난 후 unlock을 실행하여 자원 반납
로킹 단위
- 정의: lock 연산이 적용되는 데이터 단위의 크기
 - 단위의 예시:
• 전체 데이터베이스
• 릴레이션(테이블)
• 투플(레코드)
• 속성(필드) - 로킹 단위에 따른 특징: 로킹 단위가 커질수록 병행성은 낮아지지만 제어가 쉬움 . 로킹 단위가 작아질수록 제어가 어렵지만 병행성은 높아짐
 
기본 로킹 규약의 효율성 향상 방법
- 같은 데이터에 여러 트랜잭션이 동시에 read 가능하도록 개선
 - 이를 위해 lock 연산을 두 가지 종류로 구분하여 사용
 



2단계 로킹 규약 (2PL; Two-Phase Locking Protocol)
해야 할 문은 다 한 번에 잠그고, 그다음엔 문만 열고 다시 잠그면 안 되는 규칙
- 이번엔 A가 먼저 “나 이거 이거 이거 할 거야!” 하고 필요한 문을 다 한꺼번에 잠가
 - 그리고 하나씩 다 쓰고 나면, 그때부터는 문만 열기 시작하고 다시 잠그는 건 안 함
 - B도 똑같은 방식으로 움직여
 - 이렇게 하면 서로 겹치거나 기다리는 일이 훨씬 줄어들어
 
- 의미
• 기본 로킹 규약의 문제점을 해결하고 **트랜잭션의 직렬 가능성(serializability)**을 보장하기 위해 lock과 unlock 연산의 수행 시점에 대한 규약을 추가한 방식 - 방법 (2단계 구조)
- 확장 단계 (Growing Phase)
• 트랜잭션이 시작되면 이 단계로 진입
• lock 연산만 수행 가능
• 필요한 데이터를 전부 lock해야 하며, unlock은 불가 - 축소 단계 (Shrinking Phase)
• unlock 연산을 처음 수행하는 순간 이 단계로 전환
• 이후에는 unlock 연산만 수행 가능하며,
더 이상 어떤 데이터도 lock할 수 없음 
 - 확장 단계 (Growing Phase)
 - 규칙 요약
• 트랜잭션은 첫 unlock 연산 전에 필요한 모든 lock 연산을 완료해야 함 


교착 상태 (Deadlock)
- 정의
• 트랜잭션들이 서로 상대가 독점하고 있는 데이터에 대한 unlock 연산이 실행되기를 서로 기다리며 수행이 중단되는 상태 - 문제점
• 트랜잭션들이 무한히 대기 상태에 빠지게 되며, 더 이상 진행이 불가능해짐 - 대응 방법
• 교착 상태가 발생하지 않도록 예방하거나 발생 시 신속하게 탐지하여 조치를 취해야 함 
'CS > 데이터베이스' 카테고리의 다른 글
| [데이터베이스] 병행제어실습 (0) | 2025.06.15 | 
|---|---|
| [데이터베이스] ch11. 보안과 권한 관리 (0) | 2025.06.09 | 
| [데이터베이스] ch09. 정규화 (0) | 2025.06.04 | 
| [데이터베이스] ch08. 데이터베이스 설계 (0) | 2025.06.04 | 
| [데이터베이스] ch07. 데이터베이스 언어 SQL (7) | 2025.04.27 |