방송대 데이터베이스시스템 - 12강. 트랜잭션
1. 트랜잭션의 이해
데이터 동시 접근의 문제
동일 데이터에 다수 사용자의 접근 허용 시 일관성이 훼손
하나의 작업이 동시에 처리될 때 데이터에 일관성이 훼손 발생함.
DBMS는 다수의 사용자가 동시에 여러 형태의 데이터를 사용하기 위해 모아놓은 데이터의 집합
→ 이러한 형태의 데이터베이스를 일관성이 훼손되지 않도록 지속적으로 데이터를 관리해야함.
우연하게 동일한 데이터에 어떤 작업을 요청할 수 있는 사용자들이 있음.
특별한 조치가 이루어지지 않으면 당연히 일관성이 훼손된 데이터를 만들 수밖에 없음.
트랜잭션의 개념
• 데이터베이스를 조작하기 위한 하나의 논리적 단위를 이루는 일련의 연산의 집합
예) 예금 인출
작업 단위 : 예금 1000원 인출
일련의 연산 : Read(A), A = A - 1000, Write(A)
→ 논리적 작업은 1개지만 데이터베이스 입장에서의 연산은 3개임.
• 데이터베이스를 사용하여 처리하는 작업을 하나의 묶음으로 인식하여 묶음 단위(트랜잭션)로 실행되도록 정의한 개념
트랜잭션의 특징
다수의 연산으로 구성된 트랜잭션이 사용자에게 단일작업처럼 다뤄지도록 ACID 특징을 준수
ACID 특성
원자성(Atomicity) | 하나의 트랜잭션에 포함된 모든 연산은 완전히 수행되거나 전혀 수행되지 않음. (All or Nothing) |
일관성(Consistency) | 특정 트랜잭션이 수행되기 전과 후에 데이터베이스가 일관된 상태를 유지 |
고립성(Isolation) | 특정 트랜잭션이 데이터베이스를 갱신하는 동안 다른 트랜잭션에 의해 방해받지 않음. 다수의 트랜잭션이 동시에 수행될지라도 각각의 트랜잭션은 DBMS 상에서 독자적으로 처리되는 것과 같음. |
지속성(Durability) | 완료된 트랜잭션의 결과는 어떠한 시스템의 장애에도 데이터베이스에 반영되어야 함(영구 지속). |
트랜잭션 읽기와 쓰기
트랜잭션의 두 연산
Read(X) | 데이터베이스에서 데이터 X를 읽고, 트랜잭션이 실행되는 메모리의 변수 X에 값을 저장하는 연산 |
Write(X) | 트랜잭션이 실행되는 메모리에 있는 변수 X의 값을 데이터베이스에 저장하는 연산 |
계좌 A에서 B로 1,000원을 이체하는 트랜잭션
![]() |
원자성 Write(A) 연산 도중 DBMS 오류로 완료하지 못하는 경우 A에는 9,000원, B에는 20,000원이 되어 총액 1,000원이 사라짐. 원자성 보장을 위해 하나의 작업이 처리되다가 어떤 연산을 더이상 처리할 수 없어서 트랜잭션이 마무리될 수 없다고 하면 다시 돌려보내서 처리되기 이전으로 원복을 시킴. |
![]() |
일관성 A와 B의 총액은 20,000원임. 중간에 작업이 처리되고 A에서 1,000원이 빠져서 총액이 1,000원 감소하였으나, Write(B)가 끝나고 다시 전체 계좌에 잔액이 20,000원이 됨. 트랜잭션 수행 전과 후의 결과가 일관되어야 함. 트랜잭션이 실행되는 순간 일관성이 훼손되었지만 다시 끝마치고 나서 20,000원으로 일관성이 원복됨. |
![]() |
고립성 동시에 여러 개의 트랜잭션 처리를 하는 경우 데이터과 비일관된 상태를 유지함. A의 계좌에서 만원을 빼고 저장하지 않았는데, 다른 사용자가 트랜잭션 A의 계좌를 읽으면 작업이 별도로 진행됨. A의 잔고는 9천원이 되지만, 또다른 트랜잭션에서는 A의 잔고가 만원이라고 함. 하나의 트랜잭션이 처리되고 있는 동안 다른 트랜잭션이 작업을 중단되지 않도록 함. |
![]() |
지속성 작업이 다 처리되고 문제가 발생하는 경우, 지속성을 만족시켜야 하므로 데이터를 원복시키는 작업을 수행함. 실제 DB에는 A의 잔고 9,000원, B의 잔고 11,000원이 남아야 함. 정상적으로 트랜잭션이 끝났으면 그 값은 영구히 유지되는 것이 맞음. |
트랜잭션 연산자
트랜잭션의 연산
Read(X) | 데이터베이스에서 데이터 X를 읽고, 트랜잭션이 실행되는 메모리의 변수 X에 값을 저장하는 연산 |
Write(X) | 트랜잭션이 실행되는 메모리에 있는 변수 X의 값을 데이터베이스에 저장하는 연 |
트랜잭션 실행의 연산
Commit | 트랜잭션 연산에 의해 갱신된 데이터 항목의 값을 데이터베이스에 반영시키고 지속성을 확보하는 연산 |
Rollback | 트랜잭션이 중단되기 이전까지 수행한 연산에 의해 갱신된 모든 데이터 항목의 값을 무효화하여 일관성을 확보하는 연산 |
트랜잭션의 5가지 상태 변화
동작 (active) | 트랜잭션이 시작을 준비 또는 실행 중인 상태 |
부분 커밋 (partially commited) | 마지막 연산을 실행한 직후의 상태 갱신된 데이터가 메모리상에만 존재하고 데이터베이스에는 반영되지 않은 상태 |
커밋 (commited) | 모든 실행이 성공적으로 완료된 후의 상태 갱신된 데이터가 데이터베이스에 반영되어 종료된 상태 |
실패 (failed) | 실행이 정상적으로 진행될 수 없는 상태 현재까지 트랜잭션에서 실행된 모든 연산을 트랜잭션이 시작되기 이전의 상태로 롤백해야 하는 상태 |
중단 (aborted) | 실행 실패로 롤백되고 시작 이전의 상태로 환원된 상태 |
롤백(rollback) : 트랜잭션이 중단되기 이전까지 수행한 연산에 의해 변경된 내용을 무효화하는 과정
2. 트랜잭션의 동시성
동시성 고려
DBMS는 다수의 사용자가 데이터베이스를 공용으로 사용하기 위한 목적으로 도입
트랜잭션 동시 실행의 이점
- 트랜잭션 처리율과 자원 이용률을 향상
- 트랜잭션의 대기 시간을 감소
다중 사용자 환경에서 트랜잭션의 동시 실행으로 데이터 갱신 시, 일관성 훼손 문제가 발생
• 동시성 제어(concurrency control) : 다수의 트랜잭션이 성공적으로 동시에 실행되어도 일관성을 유지할 수 있도록 지원하는 기법
적용 트랜잭션
A와 B에 각각 10,000원과 20,000원 잔액
- T1 : 1,000원을 계좌 A에서 B로 이체
- T2 : 계좌 A의 잔고에서 20%를 B로 이체
• 스케줄(schedule) : 다수의 트랜잭션에 포함된 연산의 실행 순서를 명시한 것
→ 스케줄을 보고 동시에 실행해도 되는지 안 되는지를 판별
직렬 스케줄
각 트랜잭션에 속한 모든 연산이 순차적으로 실행되는 스케줄
T과 T이 순차적으로 실행되는 스케줄
![]() |
![]() |
||
왼쪽 T A : 9,000원 B : 21,000원 → 잔액 30,000원 |
오른쪽 T A : 7,200원 B : 22,800원 → 잔액 30,000원 |
왼쪽 T A : 7,000원 B : 23,000원 → 잔액 30,000원 |
오른쪽 T A : 8,000원 B : 22,000원 → 잔액 30,000원 |
스케줄 1과 스케줄 2는 모두 일관성 측면에서 문제가 없음.
병렬 스케줄
하나의 트랜잭션이 완료되기 전에 다른 트랜잭션이 실행되는 스케줄
병렬 스케줄의 순서로 연산을 수행할 경우 일관성의 훼손이 발생할 가능
T0과 T1의 비순차적 실행되는 스케줄
![]() |
![]() |
T1 - A : 9000원 T2 - A : 7,200원 T1 - B : 21,000원 T2 - B : 22,800원 → A : 7,200원, B : 22,800원이므로 총 30,000원 |
T1 - A : 10,000원 (Write가 실행되지 않아서 실제 DB에는 10,000원) T2 - A : 8,000원 T1 - A : 9,000원 (앞전 T1에서의 연산을 먼저 실행함), B : 21,000원 T2 - B : 22,000원 → A : 9,000원, B : 22,000원이므로 총 31,000원 |
스케줄 3은 일관성 유지, 스케줄 4는 일관성 훼손됨.
직렬 가능 스케줄
복수개의 트랜잭션이 동시에 수행된 결과가 직렬 스케줄의 결과와 동일한 스케줄
트랜잭션 간 연산 순서를 교환하여 트랜잭션을 직렬 스케줄과 동등하게 변환이 가능한 스케줄
사용된 Read와 Write 연산 교환 시 상황에 따라 실행 결과에 일관성이 훼손되는 현상(충돌)이 발생
충돌이 최대한 발생하지 않는 선에서 연산 순서의 교환 (단, Ii는 Ti의 연산)
![]() |
![]() |
순서를 교환해도 아무런 문제를 발생하지 않는 것은 Read 연산만 실행하는 경우라서 이때만 실행 순서를 임의로 정할 수 있음.
스케줄에 포함된 두 개의 트랜잭션 연산에 대해서 Read의 순서는 마음껏 교환할 수 있음
충돌 동등
특정 스케줄 S에서 충돌이 일어나지 않는 연산의 순서를 바꿔 스케줄 S'으로 변환이 가능한 상태
![]() |
![]() |
![]() |
![]() |
서로 다른 데이터의 교환은 충돌에 영향을 미치지 않음.
충돌 직렬성
순서 교환이 가능한 연산을 교환하여 직렬 스케줄의 연산과 동등하게 변환이 가능한 스케줄(충돌 직렬성을 확보)
충돌 직렬성을 확보하면 일관성을 유지한 결과를 반환함(스케줄 5).
충돌 직렬성을 확보하지 못하면 일관성이 훼손된 결과를 반환함(스케줄 4).
3. 트랜잭션의 특성
회복
원자성을 보장하기 위해 트랜잭션 실패 시 실해된 모든 연산을 실행 이전 상태로 복원하는 기법
회복 불가능한 스케줄 : 커밋이 되기 이전의 값을 또다른 트랜잭션이 읽어서 처리한 경우
→ 회복 가능한 스케줄로 구성되어야 함.
→ T6은 T5에 종속적임.
Read(B)를 실행한 이후에 오류가 발생하여 회복이 필요함.
T6에서 읽은 A의 값은 완전히 반영이 안 되어서 생긴 잘못된 값.
T6과 T5가 기록한 A를 읽고 커밋한 상태이므로, 커밋한 T6는 롤백 불가
스케줄8에서 오류가 발생하더라도 회복을 가능하기 하기 위해서는 T6은 T5가 커밋을 완료할 때까지 커밋을 지연해야 함.
회복 가능한 스케줄
Ti와 Tj에 대해, Ti가 기록한 데이터를 Tj가 읽을 떄, Ti의 커밋이 Tj보다 먼저 나타나는 스케줄
연쇄적 롤백 유발 가능
T7의 롤백으로 인하여 연쇄적으로 다른 트랜잭션 T9, T8도 롤백 되는 현상
비연쇄적 스케줄
연쇄적 롤백으로 발생할 수 있는 대량의 회복 연산을 방지하기 위해 연쇄적이지 않은 스케줄로 구성된 스케줄
Ti가 기록한 데이터를 읽을 때 Ti의 커밋이 Tj의 읽기 연산보다 먼저 나타나는 스케줄
T8에서 Read(A)가 T7의 Commit 이후에 실행되어야 함.
모든 비연쇄적인 스케줄은 회복이 가능함.