23|트랜잭션·ACID·병행 제어·2단계 로킹

글 요약

사무자동화산업기사 – 트랜잭션의 ACID 특성과 상태, COMMIT·ROLLBACK·회복, CRUD 매트릭스, 병행 제어 문제와 로킹·타임스탬프·2단계 로킹을 정리합니다.

데이터베이스에서는 여러 사용자가 데이터를 동시에 조회하고 변경합니다. 각각의 작업이 중간에 실패하거나 서로의 처리에 영향을 주면 잔액·재고·주문 상태처럼 서로 연결된 데이터가 일관되지 않을 수 있습니다. 이를 방지하려면 관련된 연산을 하나의 작업 단위로 묶고 성공과 실패를 명확하게 처리해야 합니다.

이 장에서는 트랜잭션과 병행 제어의 핵심을 정리합니다. 트랜잭션의 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동시에 실행되는 트랜잭션이 서로의 미완료 결과에 부당하게 간섭하지 않음각 트랜잭션이 독립적으로 실행된 것처럼 보이는가?
영속성DurabilityCOMMIT된 결과가 장애 이후에도 유지됨완료된 변경이 영구적으로 보존되는가?
ACID는 트랜잭션의 정확성과 신뢰성을 판단하는 기본 기준입니다.

원자성과 COMMIT·ROLLBACK

모든 연산이 성공하면 COMMIT으로 확정하고, 오류가 발생하면 ROLLBACK으로 미확정 변경을 취소하여 부분 반영을 막습니다.

격리성과 병행 제어

로킹·타임스탬프·다중 버전과 같은 병행 제어 기법을 이용하여 동시 실행 중인 트랜잭션의 간섭을 제한합니다.

혼동 주의: 일관성은 트랜잭션 전후에 데이터 규칙이 유지되는 성질이고, 격리성은 동시에 실행되는 트랜잭션 사이의 간섭을 제한하는 성질입니다.

CRUD 매트릭스는 무엇을 분석하는가?

CRUD 매트릭스는 업무 프로세스와 데이터 엔터티 또는 테이블 사이의 상호작용을 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)로 표시한 분석 도구입니다.

일반적으로 행에는 업무 프로세스를, 열에는 데이터 엔터티를 배치하고 각 교차 셀에 C·R·U·D를 기록합니다. 이를 통해 어떤 업무가 어떤 데이터에 영향을 주는지 확인하고 누락된 기능이나 불필요한 관계를 점검할 수 있습니다.

업무 프로세스회원주문상품결제
회원 가입C
상품 조회RR
주문 등록RCR·UC
주문 취소RUUU
회원 탈퇴DRR
CRUD 매트릭스의 예: 업무 프로세스가 데이터에 수행하는 연산을 표시합니다.
  • C: 새로운 데이터를 생성합니다.
  • R: 기존 데이터를 조회합니다.
  • U: 기존 데이터를 갱신합니다.
  • D: 기존 데이터를 삭제합니다.

활용 목적: CRUD 매트릭스는 트랜잭션의 범위를 직접 확정하는 표라기보다 업무와 데이터의 상호관계를 분석하여 트랜잭션 설계와 데이터 모델 검토에 활용하는 도구입니다.

즉시 갱신 방식은 로그를 어떻게 사용하는가?

즉시 갱신(Immediate Update)은 트랜잭션이 COMMIT되기 전에도 변경 내용을 데이터베이스에 반영할 수 있는 회복 방식입니다. 장애가 발생하면 미완료 트랜잭션의 변경을 취소하고 완료된 트랜잭션의 변경을 다시 적용해야 하므로 로그에 변경 전 값과 변경 후 값을 기록합니다.

회복 연산사용 시점기능
UNDO장애 시 미완료 트랜잭션의 변경이 데이터베이스에 반영된 경우변경 전 값으로 되돌려 미완료 작업을 취소함
REDOCOMMIT된 변경이 저장장치에 완전히 기록되지 않은 경우변경 후 값을 다시 적용하여 완료 결과를 복구함
즉시 갱신 방식은 일반적으로 UNDO와 REDO를 모두 사용할 수 있어야 합니다.

미완료 트랜잭션

COMMIT 전에 장애가 발생했다면 데이터베이스에 반영된 변경을 UNDO하여 트랜잭션 시작 전 상태로 복구합니다.

완료된 트랜잭션

COMMIT 기록은 있지만 변경이 완전히 저장되지 않았다면 로그의 변경 후 값을 이용해 REDO합니다.

로그 기록 순서: 회복이 가능하려면 데이터 페이지보다 관련 로그가 먼저 안정적인 저장장치에 기록되어야 합니다. 이를 선행 로그 기록 원칙이라고 합니다.

COMMIT·ROLLBACK·회복은 어떻게 구분하는가?

구분발생 상황핵심 기능
COMMIT트랜잭션의 모든 연산을 정상적으로 수행함변경 내용을 확정하고 성공적인 종료를 선언함
ROLLBACK사용자가 취소하거나 오류로 트랜잭션을 완료할 수 없음아직 확정하지 않은 변경을 취소함
회복시스템 장애·저장장치 오류 등으로 정상 처리가 중단됨로그와 백업 등을 이용하여 데이터베이스를 일관된 상태로 복구함
COMMIT과 ROLLBACK은 트랜잭션 제어 명령이며, 회복은 장애 이후 데이터베이스의 정상 상태를 복원하는 과정입니다.

‘COMMIT’은 성공한 변경을 확정하고, ‘ROLLBACK’은 미확정 변경을 취소하며, ‘회복’은 장애로 손상된 데이터베이스를 일관된 상태로 되돌립니다.

트랜잭션의 상태는 어떻게 변하는가?

트랜잭션은 실행 시작부터 정상 완료 또는 철회에 이르기까지 여러 상태를 거칩니다. 마지막 연산이 끝났다고 즉시 완료 상태가 되는 것이 아니라, 변경 내용이 안전하게 확정되기 전까지는 부분 완료 상태입니다.

상태영문의미다음 상태
활동Active트랜잭션이 현재 연산을 실행하고 있음부분 완료 또는 실패
부분 완료Partially Committed마지막 연산은 끝났지만 변경이 최종 확정되기 전임완료 또는 실패
완료CommittedCOMMIT이 성공하여 변경 내용이 확정됨종료
실패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
310−1을 계산해 9 저장9
410−2를 계산해 8 저장8
T1은 1개, T2는 2개의 재고를 차감하므로 두 주문이 모두 반영되면 재고는 7이어야 합니다. 그러나 T2가 T1의 갱신 전 값인 10을 기준으로 8을 저장하면서 T1의 갱신 결과가 사라져 최종 재고가 8이 됩니다.

용어 구분: 비완료 의존성은 커밋되지 않은 값을 읽는 현상이고, 연쇄 복귀는 그 값을 읽은 다른 트랜잭션들까지 연속해서 철회해야 하는 결과입니다.

병행 제어 기법에는 무엇이 있는가?

기법핵심 원리대표 특징
로킹데이터 접근 전에 잠금을 획득하고 충돌하는 접근을 대기시킴이해하기 쉽고 널리 사용되지만 교착상태가 발생할 수 있음
타임스탬프 순서트랜잭션에 고유한 시간 순서를 부여하고 그 순서에 맞게 읽기·쓰기를 허용함교착상태는 피할 수 있지만 충돌 시 트랜잭션을 철회할 수 있음
낙관적 병행 제어충돌이 적다고 가정하고 실행 후 검증 단계에서 충돌을 확인함충돌이 적은 환경에 유리하지만 검증 실패 시 재실행 필요
다중 버전 기법한 데이터의 여러 버전을 유지하여 읽기와 쓰기의 충돌을 줄임읽기 성능과 동시성을 높일 수 있지만 버전 관리가 필요함
병행 제어 기법은 충돌을 예방하거나 검증하고, 데이터 버전을 분리하는 방식으로 구분할 수 있습니다.

타임스탬프 기법은 트랜잭션 순서를 어떻게 정하는가?

타임스탬프 순서 기법은 트랜잭션이 시작될 때 DBMS가 고유하고 증가하는 타임스탬프를 부여하고, 모든 충돌 연산을 타임스탬프 순서에 맞게 처리하는 방법입니다.

  • 타임스탬프 값이 작을수록 먼저 시작한 오래된 트랜잭션으로 판단합니다.
  • 데이터 항목에는 마지막으로 읽거나 기록한 트랜잭션의 타임스탬프를 관리할 수 있습니다.
  • 타임스탬프 순서를 위반하는 읽기나 쓰기는 거부하고 해당 트랜잭션을 철회한 뒤 다시 시작할 수 있습니다.
  • 트랜잭션이 잠금을 기다리지 않으므로 잠금 대기로 인한 교착상태가 발생하지 않습니다.

주의: 타임스탬프 기법이 트랜잭션의 실제 실행을 항상 완전히 직렬화한다는 의미는 아닙니다. 연산 결과가 타임스탬프 순서의 직렬 실행과 동등하도록 제어하는 방식입니다.

로킹은 데이터 접근을 어떻게 제어하는가?

로킹(Locking)은 트랜잭션이 데이터에 접근하기 전에 잠금을 획득하고, 해당 잠금과 충돌하는 다른 트랜잭션의 접근을 제한하는 병행 제어 기법입니다.

잠금 모드영문허용되는 작업다른 잠금과의 관계
공유 잠금Shared Lock, S데이터 읽기다른 공유 잠금과 함께 사용할 수 있으나 배타 잠금과 충돌함
배타 잠금Exclusive Lock, X데이터 읽기와 쓰기다른 공유·배타 잠금과 충돌하여 단독 사용함
대표적인 잠금 모드는 읽기용 공유 잠금과 갱신용 배타 잠금입니다.

로킹 단위가 달라지면 무엇이 달라지는가?

로킹 단위는 잠금을 적용하는 데이터의 크기를 의미합니다. 데이터베이스·파일·테이블처럼 큰 단위로 잠그면 관리할 잠금 수는 줄지만 동시성이 낮아지고, 페이지·레코드·필드처럼 작은 단위로 잠그면 동시성은 높아지지만 잠금 관리 비용이 증가합니다.

비교 항목큰 로킹 단위작은 로킹 단위
대표 범위데이터베이스·파일·테이블페이지·레코드·필드
잠금 수적음많음
관리 비용상대적으로 낮음상대적으로 높음
병행성낮음높음
충돌 범위넓음좁음
로킹 단위와 병행성은 반대 방향으로 움직이고, 로킹 단위와 관리 편의성은 같은 방향으로 움직입니다.

로킹 단위가 클수록 잠금 수와 관리 비용은 줄지만 병행성은 낮아지고, 로킹 단위가 작을수록 병행성은 높지만 관리 비용이 증가합니다.

2단계 로킹은 어떤 단계로 진행되는가?

2단계 로킹(Two-Phase Locking, 2PL)은 하나의 트랜잭션에서 잠금을 획득하는 구간과 잠금을 해제하는 구간을 명확히 분리하는 규약입니다.

확장 단계

  • 필요한 잠금을 새로 획득할 수 있습니다.
  • 이미 획득한 잠금을 해제하지 않습니다.
  • 잠금 수가 증가하거나 유지됩니다.

축소 단계

  • 획득한 잠금을 해제할 수 있습니다.
  • 새로운 잠금을 획득하지 않습니다.
  • 잠금 수가 감소합니다.

트랜잭션은 첫 번째 잠금을 해제하는 순간 축소 단계에 들어갑니다. 이후에는 어떤 데이터에도 새로운 잠금을 요청할 수 없습니다.

특징설명
직렬 가능성2단계 로킹 규약을 지키는 스케줄은 충돌 직렬 가능성을 보장합니다.
교착상태서로 필요한 잠금을 기다리는 교착상태는 여전히 발생할 수 있습니다.
연쇄 복귀일반 2PL만으로는 연쇄 복귀를 완전히 방지하지 못할 수 있습니다.
엄격한 2PL배타 잠금을 COMMIT 또는 ROLLBACK까지 유지하면 다른 트랜잭션이 미완료 갱신값을 읽거나 덮어쓰지 못하므로 연쇄 복귀를 방지할 수 있습니다.
2단계 로킹은 직렬 가능성을 보장하지만 교착상태 예방 규약은 아닙니다.

시험 포인트: ‘직렬성은 보장하지만 교착상태 예방은 불가능하다’는 문장은 2단계 로킹은 직렬 가능성을 보장하지만 교착상태를 예방하지는 못한다는 의미입니다.

시험에서 자주 혼동되는 개념

원자성과 일관성

원자성은 모든 연산의 전체 수행 또는 전체 취소이고, 일관성은 트랜잭션 전후에 데이터 규칙을 유지하는 성질입니다.

격리성과 병행성

격리성은 트랜잭션 간 부당한 간섭을 막는 성질이고, 병행성은 여러 트랜잭션을 동시에 처리할 수 있는 정도입니다.

부분 완료와 완료

부분 완료는 마지막 연산만 끝난 상태이고, 완료는 COMMIT에 성공하여 변경 내용이 확정된 상태입니다.

실패와 철회

실패는 더 이상 정상 실행할 수 없는 상태이고, 철회는 변경을 실제로 취소하여 트랜잭션 이전 상태로 복구한 상태입니다.

비완료 의존성과 연쇄 복귀

비완료 의존성은 미완료 값을 읽는 현상이고, 연쇄 복귀는 그 값을 사용한 다른 트랜잭션까지 연속해서 철회해야 하는 결과입니다.

2단계 로킹과 교착상태

2단계 로킹은 직렬 가능성을 보장하지만, 트랜잭션들이 서로 잠금을 기다리는 교착상태는 발생할 수 있습니다.

ACID는 트랜잭션의 신뢰성을 설명하고, 병행 제어는 여러 트랜잭션이 동시에 실행될 때 그 신뢰성을 유지하는 방법을 설명합니다.

이번 장 핵심 요약

  1. 트랜잭션은 하나의 논리적인 기능을 수행하기 위한 데이터베이스 연산의 집합입니다.
  2. 원자성은 모든 연산을 전부 수행하거나 전부 취소하는 성질입니다.
  3. 일관성은 트랜잭션 전후에 무결성 제약조건과 업무 규칙을 유지하는 성질입니다.
  4. 격리성은 동시에 실행되는 트랜잭션이 서로의 미완료 결과에 부당하게 간섭하지 않는 성질입니다.
  5. 영속성은 COMMIT된 결과가 장애 이후에도 보존되는 성질입니다.
  6. CRUD 매트릭스는 업무 프로세스와 데이터 사이의 C·R·U·D 관계를 분석합니다.
  7. 즉시 갱신 방식은 로그에 변경 전·후 값을 기록하고 UNDO와 REDO를 사용합니다.
  8. COMMIT은 변경을 확정하고 ROLLBACK은 미확정 변경을 취소합니다.
  9. 트랜잭션 상태는 활동·부분 완료·완료·실패·철회로 구분합니다.
  10. 병행 제어는 자원 공유와 처리량을 높이면서 일관성과 격리성을 유지합니다.
  11. 갱신 분실은 뒤의 갱신이 앞의 갱신 결과를 덮어쓰는 문제입니다.
  12. 비완료 의존성은 다른 트랜잭션의 미확정 데이터를 읽는 문제입니다.
  13. 모순성은 조회나 집계 도중 데이터가 변경되어 서로 다른 시점의 값이 섞이는 문제입니다.
  14. 연쇄 복귀는 미완료 값을 사용한 트랜잭션들이 연속해서 철회되는 문제입니다.
  15. 로킹 단위가 클수록 관리가 쉽지만 병행성은 낮아집니다.
  16. 타임스탬프 기법은 고유한 시간 순서에 따라 충돌 연산을 제어합니다.
  17. 2단계 로킹은 확장 단계와 축소 단계로 구성되며 직렬 가능성을 보장합니다.
  18. 2단계 로킹에서도 교착상태는 발생할 수 있습니다.

복습 문제

하나의 논리적인 기능을 수행하기 위한 데이터베이스 연산의 집합은?

트랜잭션입니다.

트랜잭션의 연산을 모두 수행하거나 모두 수행하지 않아야 한다는 특성은?

원자성(Atomicity)입니다.

COMMIT된 결과가 장애 이후에도 유지되어야 한다는 특성은?

영속성(Durability)입니다.

트랜잭션의 마지막 연산은 끝났지만 결과가 최종 확정되기 전의 상태는?

부분 완료 상태(Partially Committed)입니다.

오류로 더 이상 정상 실행할 수 없는 상태와 변경 취소를 완료한 상태는 각각 무엇인가?

각각 실패 상태(Failed)와 철회 상태(Aborted)입니다.

즉시 갱신 방식에서 미완료 변경을 취소하는 회복 연산은?

UNDO입니다.

완료된 트랜잭션의 변경을 다시 적용하는 회복 연산은?

REDO입니다.

다른 트랜잭션의 갱신 결과를 덮어써 먼저 수행한 변경이 사라지는 문제는?

갱신 분실입니다.

아직 COMMIT하지 않은 다른 트랜잭션의 값을 읽는 문제는?

비완료 의존성 또는 더티 리드입니다.

로킹 단위가 작아질수록 잠금 수와 병행성은 어떻게 변하는가?

잠금 수는 증가하고 병행성도 높아집니다. 대신 잠금 관리 비용이 증가합니다.

새로운 잠금을 획득할 수 있지만 기존 잠금을 해제할 수 없는 2단계 로킹의 단계는?

확장 단계입니다.

2단계 로킹은 교착상태를 예방하는가?

아닙니다. 충돌 직렬 가능성은 보장하지만 교착상태는 발생할 수 있습니다.

참고자료

이 글은 사무자동화산업기사 시험 범위에 포함된 트랜잭션의 ACID 특성·상태·회복, CRUD 매트릭스와 병행 제어 기법을 이해하고 복습할 수 있도록 재구성한 정리입니다. 잠금 모드, 회복 알고리즘, 격리 수준과 다중 버전 구현은 DBMS마다 차이가 있으므로 실제 시험에서는 문제에 제시된 정의와 최신 Q-Net 출제기준을 함께 확인해야 합니다.


같은 주제의 다른 글

이 글과 같은 카테고리에 있는 이전 글과 다음 글을 확인해보세요.