데이터베이스에서는 여러 사용자가 데이터를 동시에 조회하고 변경합니다. 각각의 작업이 중간에 실패하거나 서로의 처리에 영향을 주면 잔액·재고·주문 상태처럼 서로 연결된 데이터가 일관되지 않을 수 있습니다. 이를 방지하려면 관련된 연산을 하나의 작업 단위로 묶고 성공과 실패를 명확하게 처리해야 합니다.
이 장에서는 트랜잭션과 병행 제어의 핵심을 정리합니다. 트랜잭션의 ACID 특성과 상태, COMMIT·ROLLBACK·회복, CRUD 매트릭스를 살펴본 뒤 병행 수행에서 발생하는 갱신 분실·비완료 의존성·모순성·연쇄 복귀와 로킹·타임스탬프·2단계 로킹의 원리를 비교합니다.
이 장의 핵심 내용
- 트랜잭션은 하나의 논리적인 기능을 수행하기 위한 데이터베이스 연산의 집합입니다.
- 트랜잭션의 ACID 특성은 원자성·일관성·격리성·영속성입니다.
- COMMIT은 변경을 확정하고, ROLLBACK은 아직 확정하지 않은 변경을 취소합니다.
- 즉시 갱신 방식은 완료 전에 데이터베이스를 변경할 수 있으므로 로그와 UNDO·REDO가 필요합니다.
- 트랜잭션 상태는 활동·부분 완료·완료·실패·철회로 구분합니다.
- CRUD 매트릭스는 업무 프로세스와 데이터 사이의 생성·읽기·갱신·삭제 관계를 분석합니다.
- 병행 제어는 동시 실행의 효율을 높이면서 데이터 일관성과 격리성을 유지합니다.
- 대표적인 병행 수행 문제는 갱신 분실·비완료 의존성·모순성·연쇄 복귀입니다.
- 병행 제어 기법에는 로킹·타임스탬프 순서·낙관적 병행 제어·다중 버전 기법이 있습니다.
- 2단계 로킹은 잠금을 획득하는 확장 단계와 잠금을 해제하는 축소 단계로 구성됩니다.
트랜잭션은 무엇인가?
트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적인 기능을 수행하기 위해 묶은 연산의 집합입니다. 여러 SQL문으로 구성되더라도 업무상 하나의 작업이라면 전체가 하나의 트랜잭션으로 처리될 수 있습니다.
예를 들어 계좌 A에서 10만원을 출금하여 계좌 B에 입금하는 이체 업무는 두 개의 갱신으로 이루어집니다. 출금만 성공하고 입금이 실패하면 전체 잔액이 맞지 않으므로 두 연산은 함께 성공하거나 함께 취소되어야 합니다.
불완전한 처리
- 계좌 A에서 10만원 출금
- 계좌 B 입금 중 오류 발생
- 출금만 남으면 데이터 불일치
트랜잭션 처리
- 출금과 입금을 하나의 작업으로 묶음
- 둘 다 성공하면 COMMIT
- 하나라도 실패하면 ROLLBACK
트랜잭션의 ACID 특성은 무엇인가?
데이터베이스 트랜잭션은 신뢰할 수 있는 처리를 위해 원자성, 일관성, 격리성, 영속성이라는 네 가지 특성을 만족해야 합니다. 네 영문 명칭의 첫 글자를 따서 ACID라고 합니다.
| 특성 | 영문 | 핵심 의미 | 대표 질문 |
|---|---|---|---|
| 원자성 | Atomicity | 트랜잭션의 연산을 전부 수행하거나 전부 취소함 | 일부 연산만 반영되지 않았는가? |
| 일관성 | Consistency | 트랜잭션 전후에 무결성 제약조건과 업무 규칙을 만족함 | 처리 후에도 데이터 규칙이 유지되는가? |
| 격리성 | Isolation | 동시에 실행되는 트랜잭션이 서로의 미완료 결과에 부당하게 간섭하지 않음 | 각 트랜잭션이 독립적으로 실행된 것처럼 보이는가? |
| 영속성 | Durability | COMMIT된 결과가 장애 이후에도 유지됨 | 완료된 변경이 영구적으로 보존되는가? |
원자성과 COMMIT·ROLLBACK
모든 연산이 성공하면 COMMIT으로 확정하고, 오류가 발생하면 ROLLBACK으로 미확정 변경을 취소하여 부분 반영을 막습니다.
격리성과 병행 제어
로킹·타임스탬프·다중 버전과 같은 병행 제어 기법을 이용하여 동시 실행 중인 트랜잭션의 간섭을 제한합니다.
혼동 주의: 일관성은 트랜잭션 전후에 데이터 규칙이 유지되는 성질이고, 격리성은 동시에 실행되는 트랜잭션 사이의 간섭을 제한하는 성질입니다.
CRUD 매트릭스는 무엇을 분석하는가?
CRUD 매트릭스는 업무 프로세스와 데이터 엔터티 또는 테이블 사이의 상호작용을 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)로 표시한 분석 도구입니다.
일반적으로 행에는 업무 프로세스를, 열에는 데이터 엔터티를 배치하고 각 교차 셀에 C·R·U·D를 기록합니다. 이를 통해 어떤 업무가 어떤 데이터에 영향을 주는지 확인하고 누락된 기능이나 불필요한 관계를 점검할 수 있습니다.
| 업무 프로세스 | 회원 | 주문 | 상품 | 결제 |
|---|---|---|---|---|
| 회원 가입 | C | - | - | - |
| 상품 조회 | R | - | R | - |
| 주문 등록 | R | C | R·U | C |
| 주문 취소 | R | U | U | U |
| 회원 탈퇴 | D | R | - | R |
- C: 새로운 데이터를 생성합니다.
- R: 기존 데이터를 조회합니다.
- U: 기존 데이터를 갱신합니다.
- D: 기존 데이터를 삭제합니다.
활용 목적: CRUD 매트릭스는 트랜잭션의 범위를 직접 확정하는 표라기보다 업무와 데이터의 상호관계를 분석하여 트랜잭션 설계와 데이터 모델 검토에 활용하는 도구입니다.
즉시 갱신 방식은 로그를 어떻게 사용하는가?
즉시 갱신(Immediate Update)은 트랜잭션이 COMMIT되기 전에도 변경 내용을 데이터베이스에 반영할 수 있는 회복 방식입니다. 장애가 발생하면 미완료 트랜잭션의 변경을 취소하고 완료된 트랜잭션의 변경을 다시 적용해야 하므로 로그에 변경 전 값과 변경 후 값을 기록합니다.
| 회복 연산 | 사용 시점 | 기능 |
|---|---|---|
| UNDO | 장애 시 미완료 트랜잭션의 변경이 데이터베이스에 반영된 경우 | 변경 전 값으로 되돌려 미완료 작업을 취소함 |
| REDO | COMMIT된 변경이 저장장치에 완전히 기록되지 않은 경우 | 변경 후 값을 다시 적용하여 완료 결과를 복구함 |
미완료 트랜잭션
COMMIT 전에 장애가 발생했다면 데이터베이스에 반영된 변경을 UNDO하여 트랜잭션 시작 전 상태로 복구합니다.
완료된 트랜잭션
COMMIT 기록은 있지만 변경이 완전히 저장되지 않았다면 로그의 변경 후 값을 이용해 REDO합니다.
로그 기록 순서: 회복이 가능하려면 데이터 페이지보다 관련 로그가 먼저 안정적인 저장장치에 기록되어야 합니다. 이를 선행 로그 기록 원칙이라고 합니다.
COMMIT·ROLLBACK·회복은 어떻게 구분하는가?
| 구분 | 발생 상황 | 핵심 기능 |
|---|---|---|
| COMMIT | 트랜잭션의 모든 연산을 정상적으로 수행함 | 변경 내용을 확정하고 성공적인 종료를 선언함 |
| ROLLBACK | 사용자가 취소하거나 오류로 트랜잭션을 완료할 수 없음 | 아직 확정하지 않은 변경을 취소함 |
| 회복 | 시스템 장애·저장장치 오류 등으로 정상 처리가 중단됨 | 로그와 백업 등을 이용하여 데이터베이스를 일관된 상태로 복구함 |
트랜잭션의 상태는 어떻게 변하는가?
트랜잭션은 실행 시작부터 정상 완료 또는 철회에 이르기까지 여러 상태를 거칩니다. 마지막 연산이 끝났다고 즉시 완료 상태가 되는 것이 아니라, 변경 내용이 안전하게 확정되기 전까지는 부분 완료 상태입니다.
| 상태 | 영문 | 의미 | 다음 상태 |
|---|---|---|---|
| 활동 | Active | 트랜잭션이 현재 연산을 실행하고 있음 | 부분 완료 또는 실패 |
| 부분 완료 | Partially Committed | 마지막 연산은 끝났지만 변경이 최종 확정되기 전임 | 완료 또는 실패 |
| 완료 | Committed | COMMIT이 성공하여 변경 내용이 확정됨 | 종료 |
| 실패 | Failed | 오류나 장애로 더 이상 정상 실행할 수 없음 | 철회 |
| 철회 | Aborted | 변경을 취소하여 트랜잭션 이전 상태로 돌아감 | 종료 또는 재시작 |
정상 경로
활동 → 부분 완료 → 완료
마지막 연산을 수행한 뒤 COMMIT이 성공하면 완료 상태가 됩니다.
실패 경로
활동 또는 부분 완료 → 실패 → 철회
오류를 확인한 뒤 변경을 취소하여 일관된 상태로 되돌립니다.
부분 완료와 완료: 부분 완료는 마지막 SQL 처리가 끝난 상태이고, 완료는 COMMIT이 성공하여 트랜잭션의 최종 결과가 데이터베이스에 확정된 상태입니다.
병행 제어는 왜 필요한가?
병행 제어(Concurrency Control)는 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션의 정확성을 유지하면서 데이터베이스 자원을 효율적으로 공유하도록 실행 순서를 제어하는 기술입니다.
병행 실행의 이점
- 데이터베이스 자원 공유 향상
- 시스템 처리량 증가
- 사용자 응답 시간 단축
- CPU와 입출력 장치 활용도 향상
제어하지 않을 때의 위험
- 갱신 결과의 손실
- 미완료 데이터 읽기
- 조회 결과의 모순
- 여러 트랜잭션의 연쇄 복귀
병행 수행에서는 어떤 문제가 발생하는가?
| 문제 | 영문 표현 | 발생 원인 | 결과 |
|---|---|---|---|
| 갱신 분실 | Lost Update | 두 트랜잭션이 같은 값을 읽고 각각 갱신하여 뒤의 갱신이 앞의 갱신을 덮어씀 | 먼저 수행한 갱신 결과가 사라짐 |
| 비완료 의존성 | Uncommitted Dependency Dirty Read | 한 트랜잭션이 아직 COMMIT하지 않은 다른 트랜잭션의 값을 읽음 | 읽은 값이 ROLLBACK되면 잘못된 데이터를 사용함 |
| 모순성 | Inconsistent Analysis | 집계나 조회 도중 다른 트랜잭션이 일부 데이터를 변경함 | 서로 다른 시점의 값이 섞인 결과를 얻음 |
| 연쇄 복귀 | Cascading Rollback | 미완료 변경을 읽은 여러 트랜잭션이 그 값을 이용해 추가 작업을 수행함 | 원래 트랜잭션이 철회되면 관련 트랜잭션도 함께 철회해야 함 |
갱신 분실은 어떻게 발생하는가?
| 순서 | 트랜잭션 T1: 1개 주문 | 트랜잭션 T2: 2개 주문 | 저장된 재고 |
|---|---|---|---|
| 1 | 재고 10 읽기 | - | 10 |
| 2 | - | 재고 10 읽기 | 10 |
| 3 | 10−1을 계산해 9 저장 | - | 9 |
| 4 | - | 10−2를 계산해 8 저장 | 8 |
용어 구분: 비완료 의존성은 커밋되지 않은 값을 읽는 현상이고, 연쇄 복귀는 그 값을 읽은 다른 트랜잭션들까지 연속해서 철회해야 하는 결과입니다.
병행 제어 기법에는 무엇이 있는가?
| 기법 | 핵심 원리 | 대표 특징 |
|---|---|---|
| 로킹 | 데이터 접근 전에 잠금을 획득하고 충돌하는 접근을 대기시킴 | 이해하기 쉽고 널리 사용되지만 교착상태가 발생할 수 있음 |
| 타임스탬프 순서 | 트랜잭션에 고유한 시간 순서를 부여하고 그 순서에 맞게 읽기·쓰기를 허용함 | 교착상태는 피할 수 있지만 충돌 시 트랜잭션을 철회할 수 있음 |
| 낙관적 병행 제어 | 충돌이 적다고 가정하고 실행 후 검증 단계에서 충돌을 확인함 | 충돌이 적은 환경에 유리하지만 검증 실패 시 재실행 필요 |
| 다중 버전 기법 | 한 데이터의 여러 버전을 유지하여 읽기와 쓰기의 충돌을 줄임 | 읽기 성능과 동시성을 높일 수 있지만 버전 관리가 필요함 |
타임스탬프 기법은 트랜잭션 순서를 어떻게 정하는가?
타임스탬프 순서 기법은 트랜잭션이 시작될 때 DBMS가 고유하고 증가하는 타임스탬프를 부여하고, 모든 충돌 연산을 타임스탬프 순서에 맞게 처리하는 방법입니다.
- 타임스탬프 값이 작을수록 먼저 시작한 오래된 트랜잭션으로 판단합니다.
- 데이터 항목에는 마지막으로 읽거나 기록한 트랜잭션의 타임스탬프를 관리할 수 있습니다.
- 타임스탬프 순서를 위반하는 읽기나 쓰기는 거부하고 해당 트랜잭션을 철회한 뒤 다시 시작할 수 있습니다.
- 트랜잭션이 잠금을 기다리지 않으므로 잠금 대기로 인한 교착상태가 발생하지 않습니다.
주의: 타임스탬프 기법이 트랜잭션의 실제 실행을 항상 완전히 직렬화한다는 의미는 아닙니다. 연산 결과가 타임스탬프 순서의 직렬 실행과 동등하도록 제어하는 방식입니다.
로킹은 데이터 접근을 어떻게 제어하는가?
로킹(Locking)은 트랜잭션이 데이터에 접근하기 전에 잠금을 획득하고, 해당 잠금과 충돌하는 다른 트랜잭션의 접근을 제한하는 병행 제어 기법입니다.
| 잠금 모드 | 영문 | 허용되는 작업 | 다른 잠금과의 관계 |
|---|---|---|---|
| 공유 잠금 | Shared Lock, S | 데이터 읽기 | 다른 공유 잠금과 함께 사용할 수 있으나 배타 잠금과 충돌함 |
| 배타 잠금 | Exclusive Lock, X | 데이터 읽기와 쓰기 | 다른 공유·배타 잠금과 충돌하여 단독 사용함 |
로킹 단위가 달라지면 무엇이 달라지는가?
로킹 단위는 잠금을 적용하는 데이터의 크기를 의미합니다. 데이터베이스·파일·테이블처럼 큰 단위로 잠그면 관리할 잠금 수는 줄지만 동시성이 낮아지고, 페이지·레코드·필드처럼 작은 단위로 잠그면 동시성은 높아지지만 잠금 관리 비용이 증가합니다.
| 비교 항목 | 큰 로킹 단위 | 작은 로킹 단위 |
|---|---|---|
| 대표 범위 | 데이터베이스·파일·테이블 | 페이지·레코드·필드 |
| 잠금 수 | 적음 | 많음 |
| 관리 비용 | 상대적으로 낮음 | 상대적으로 높음 |
| 병행성 | 낮음 | 높음 |
| 충돌 범위 | 넓음 | 좁음 |
2단계 로킹은 어떤 단계로 진행되는가?
2단계 로킹(Two-Phase Locking, 2PL)은 하나의 트랜잭션에서 잠금을 획득하는 구간과 잠금을 해제하는 구간을 명확히 분리하는 규약입니다.
확장 단계
- 필요한 잠금을 새로 획득할 수 있습니다.
- 이미 획득한 잠금을 해제하지 않습니다.
- 잠금 수가 증가하거나 유지됩니다.
축소 단계
- 획득한 잠금을 해제할 수 있습니다.
- 새로운 잠금을 획득하지 않습니다.
- 잠금 수가 감소합니다.
트랜잭션은 첫 번째 잠금을 해제하는 순간 축소 단계에 들어갑니다. 이후에는 어떤 데이터에도 새로운 잠금을 요청할 수 없습니다.
| 특징 | 설명 |
|---|---|
| 직렬 가능성 | 2단계 로킹 규약을 지키는 스케줄은 충돌 직렬 가능성을 보장합니다. |
| 교착상태 | 서로 필요한 잠금을 기다리는 교착상태는 여전히 발생할 수 있습니다. |
| 연쇄 복귀 | 일반 2PL만으로는 연쇄 복귀를 완전히 방지하지 못할 수 있습니다. |
| 엄격한 2PL | 배타 잠금을 COMMIT 또는 ROLLBACK까지 유지하면 다른 트랜잭션이 미완료 갱신값을 읽거나 덮어쓰지 못하므로 연쇄 복귀를 방지할 수 있습니다. |
시험 포인트: ‘직렬성은 보장하지만 교착상태 예방은 불가능하다’는 문장은 2단계 로킹은 직렬 가능성을 보장하지만 교착상태를 예방하지는 못한다는 의미입니다.
시험에서 자주 혼동되는 개념
원자성과 일관성
원자성은 모든 연산의 전체 수행 또는 전체 취소이고, 일관성은 트랜잭션 전후에 데이터 규칙을 유지하는 성질입니다.
격리성과 병행성
격리성은 트랜잭션 간 부당한 간섭을 막는 성질이고, 병행성은 여러 트랜잭션을 동시에 처리할 수 있는 정도입니다.
부분 완료와 완료
부분 완료는 마지막 연산만 끝난 상태이고, 완료는 COMMIT에 성공하여 변경 내용이 확정된 상태입니다.
실패와 철회
실패는 더 이상 정상 실행할 수 없는 상태이고, 철회는 변경을 실제로 취소하여 트랜잭션 이전 상태로 복구한 상태입니다.
비완료 의존성과 연쇄 복귀
비완료 의존성은 미완료 값을 읽는 현상이고, 연쇄 복귀는 그 값을 사용한 다른 트랜잭션까지 연속해서 철회해야 하는 결과입니다.
2단계 로킹과 교착상태
2단계 로킹은 직렬 가능성을 보장하지만, 트랜잭션들이 서로 잠금을 기다리는 교착상태는 발생할 수 있습니다.
이번 장 핵심 요약
- 트랜잭션은 하나의 논리적인 기능을 수행하기 위한 데이터베이스 연산의 집합입니다.
- 원자성은 모든 연산을 전부 수행하거나 전부 취소하는 성질입니다.
- 일관성은 트랜잭션 전후에 무결성 제약조건과 업무 규칙을 유지하는 성질입니다.
- 격리성은 동시에 실행되는 트랜잭션이 서로의 미완료 결과에 부당하게 간섭하지 않는 성질입니다.
- 영속성은 COMMIT된 결과가 장애 이후에도 보존되는 성질입니다.
- CRUD 매트릭스는 업무 프로세스와 데이터 사이의 C·R·U·D 관계를 분석합니다.
- 즉시 갱신 방식은 로그에 변경 전·후 값을 기록하고 UNDO와 REDO를 사용합니다.
- COMMIT은 변경을 확정하고 ROLLBACK은 미확정 변경을 취소합니다.
- 트랜잭션 상태는 활동·부분 완료·완료·실패·철회로 구분합니다.
- 병행 제어는 자원 공유와 처리량을 높이면서 일관성과 격리성을 유지합니다.
- 갱신 분실은 뒤의 갱신이 앞의 갱신 결과를 덮어쓰는 문제입니다.
- 비완료 의존성은 다른 트랜잭션의 미확정 데이터를 읽는 문제입니다.
- 모순성은 조회나 집계 도중 데이터가 변경되어 서로 다른 시점의 값이 섞이는 문제입니다.
- 연쇄 복귀는 미완료 값을 사용한 트랜잭션들이 연속해서 철회되는 문제입니다.
- 로킹 단위가 클수록 관리가 쉽지만 병행성은 낮아집니다.
- 타임스탬프 기법은 고유한 시간 순서에 따라 충돌 연산을 제어합니다.
- 2단계 로킹은 확장 단계와 축소 단계로 구성되며 직렬 가능성을 보장합니다.
- 2단계 로킹에서도 교착상태는 발생할 수 있습니다.
복습 문제
하나의 논리적인 기능을 수행하기 위한 데이터베이스 연산의 집합은?
트랜잭션입니다.
트랜잭션의 연산을 모두 수행하거나 모두 수행하지 않아야 한다는 특성은?
원자성(Atomicity)입니다.
COMMIT된 결과가 장애 이후에도 유지되어야 한다는 특성은?
영속성(Durability)입니다.
트랜잭션의 마지막 연산은 끝났지만 결과가 최종 확정되기 전의 상태는?
부분 완료 상태(Partially Committed)입니다.
오류로 더 이상 정상 실행할 수 없는 상태와 변경 취소를 완료한 상태는 각각 무엇인가?
각각 실패 상태(Failed)와 철회 상태(Aborted)입니다.
즉시 갱신 방식에서 미완료 변경을 취소하는 회복 연산은?
UNDO입니다.
완료된 트랜잭션의 변경을 다시 적용하는 회복 연산은?
REDO입니다.
다른 트랜잭션의 갱신 결과를 덮어써 먼저 수행한 변경이 사라지는 문제는?
갱신 분실입니다.
아직 COMMIT하지 않은 다른 트랜잭션의 값을 읽는 문제는?
비완료 의존성 또는 더티 리드입니다.
로킹 단위가 작아질수록 잠금 수와 병행성은 어떻게 변하는가?
잠금 수는 증가하고 병행성도 높아집니다. 대신 잠금 관리 비용이 증가합니다.
새로운 잠금을 획득할 수 있지만 기존 잠금을 해제할 수 없는 2단계 로킹의 단계는?
확장 단계입니다.
2단계 로킹은 교착상태를 예방하는가?
아닙니다. 충돌 직렬 가능성은 보장하지만 교착상태는 발생할 수 있습니다.
참고자료
- 학습 범위 — 사무자동화산업기사 제1과목 사무자동화 시스템, 트랜잭션·병행 제어
- Q-Net — 사무자동화산업기사 종목별 상세정보
- PostgreSQL Documentation — Transactions
- PostgreSQL Documentation — COMMIT
- PostgreSQL Documentation — ROLLBACK
- PostgreSQL Documentation — Concurrency Control
- PostgreSQL Documentation — Transaction Isolation
- PostgreSQL Documentation — Explicit Locking
이 글은 사무자동화산업기사 시험 범위에 포함된 트랜잭션의 ACID 특성·상태·회복, CRUD 매트릭스와 병행 제어 기법을 이해하고 복습할 수 있도록 재구성한 정리입니다. 잠금 모드, 회복 알고리즘, 격리 수준과 다중 버전 구현은 DBMS마다 차이가 있으므로 실제 시험에서는 문제에 제시된 정의와 최신 Q-Net 출제기준을 함께 확인해야 합니다.