트랜잭션의 네 성질(ACID)
주문 생성은 재고 차감, 결제 기록, 주문 상태 저장처럼 여러 변경으로 이루어진다. 중간 한 단계만 반영되면 데이터 각각은 저장되어 있어도 업무 전체는 틀린다. 트랜잭션은 이 여러 변경을 하나의 논리적 작업으로 묶고, 동시에 실행되거나 장애가 나도 지켜야 할 경계를 만든다.
돈은 빠졌는데 주문은 없다면
주문 생성은 재고 차감, 결제 기록, 주문 상태 저장처럼 여러 변경으로 이루어진다. 중간 한 단계만 반영되면 데이터 각각은 저장되어 있어도 업무 전체는 틀린다. 트랜잭션은 이 여러 변경을 하나의 논리적 작업으로 묶고, 동시에 실행되거나 장애가 나도 지켜야 할 경계를 만든다.
먼저 되짚기: 상태
상태는 다음 동작과 결과에 영향을 주는 현재 보존값이다. 트랜잭션은 여러 상태변경을 어느 논리적 경계에서 함께 성공·취소할지 정한다.
먼저 고정할 것: 트랜잭션의 경계
트랜잭션의 경계는 여러 상태변경을 하나의 논리적 업무로 보고 어디서 함께 성공을 확정하고, 어디서 함께 취소할지 정하는 범위다. 재고 차감과 주문 생성이 한 업무 불변조건을 만든다면 중간 하나만 남지 않도록 같은 완료·취소 경계에서 다룬다. 이 경계를 먼저 정한 뒤 실패·동시성·복구 상황에서 필요한 보장을 ACID로 구체화한다.
다시 연결하기: 트랜잭션에서 ACID로
트랜잭션은 여러 변경을 하나의 논리적 작업으로 묶고 완료·취소 경계를 정한다. ACID는 이 작업이 실패·동시성·복구 상황에서 어떤 보장을 제공해야 하는지 구체화한다.
트랜잭션과 ACID
트랜잭션(transaction)은 함께 성공하거나 실패해야 하는 하나의 논리적 작업단위다. ACID는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 머리글자를 묶은 트랜잭션 성질이다. 원자성은 전부 반영 또는 전부 취소, ACID 일관성은 업무 불변조건을 만족하는 상태 사이의 이동, 격리성은 동시 작업의 중간효과 통제, 지속성은 완료를 확인한 결과가 장애 뒤에도 보존됨을 뜻한다.
시작·변경·완료의 경계
프로그램은 작업을 시작하고 관련 행을 읽고 바꾼 뒤, 모든 검사를 통과하면 커밋해 완료를 확정한다. 오류가 나면 롤백해 아직 확정되지 않은 변경을 취소한다. DBMS는 동시 접근 순서와 복구 기록을 관리하지만, 재고는 음수가 될 수 없다 같은 업무 불변조건은 설계자가 명시해야 한다.
크게 묶어도 작게 묶어도 문제다
트랜잭션이 지나치게 크면 잠금과 충돌이 늘고, 너무 작으면 업무상 함께 지켜야 할 변경이 갈라진다. 여러 서비스와 데이터베이스에 걸친 작업은 한 DB의 ACID만으로 끝나지 않으므로 각 단계 상태, 재시도, 보정과 중복 방지를 따로 설계한다. 일관성은 제품이 업무규칙을 대신 안다는 뜻이 아니다.
논리 작업을 커밋 경계로 묶는다
도식의 BEGIN은 작업 시작, COMMIT은 변경의 확정, ROLLBACK은 미확정 변경의 취소를 표시한다. 화살표는 이 작업 안의 처리와 실패 경로이며, 아래 상자 밖 결제까지 함께 취소된다는 뜻은 아니다.
업무 변경의 완료와 취소를 한 DB 경계에 둔다 · 상태 따라가기
BEGIN 안에서 재고 조건을 확인하고 주문 변경을 같은 거래에 둔다. 모든 단계에서 재고·주문·거래 결정의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
BEGIN 안의 재고 검사·차감·주문 생성은 함께 완료하거나 미확정 변경을 취소한다. 오류나 불변조건 불충족은 ROLLBACK으로, 통과는 COMMIT으로 이어진다. 동시 접근 순서·격리를 경계 안에서 통제하고 커밋 결과를 로그·복구로 보존한다. 외부 결제는 이 취소 경계에 자동 포함되지 않는다.
이 예의 조건
- BEGIN 안의 재고 검사·차감·주문 생성은 함께 완료하거나 미확정 변경을 취소한다. 오류나 불변조건 불충족은 ROLLBACK으로, 통과는 COMMIT으로 이어진다. 동시 접근 순서·격리를 경계 안에서 통제하고 커밋 결과를 로그·복구로 보존한다. 외부 결제는 이 취소 경계에 자동 포함되지 않는다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| BEGIN | 작업 시작 |
| 재고 읽기·검사 | 허용 조건 확인 |
| 재고 차감 | 미확정 변경 |
| 주문 행 생성 | 같은 논리 작업 |
| 불변조건 | 재확인 |
| ROLLBACK | 미확정 변경 취소 |
| COMMIT | 변경 확정 |
| 장애 후 보존 | 완료 확인 결과 / 복구기록 |
| 연결 | 원 라벨·방향 |
|---|---|
| BEGIN → 재고 읽기·검사 | 시작 / 정방향 / 실선 |
| 재고 읽기·검사 → 재고 차감 | 통과 / 정방향 / 실선 |
| 재고 차감 → 주문 행 생성 | 변경 / 정방향 / 실선 |
| 주문 행 생성 → 불변조건 | 재확인 / 정방향 / 실선 |
| 재고 읽기·검사 → ROLLBACK | 오류 / 정방향 / 실선 |
| 재고 차감 → ROLLBACK | 오류 / 정방향 / 실선 |
| 주문 행 생성 → ROLLBACK | 삽입 오류 / 정방향 / 실선 |
| 불변조건 → ROLLBACK | 불충족 / 정방향 / 실선 |
| 불변조건 → COMMIT | 통과 / 정방향 / 실선 |
| COMMIT → 장애 후 보존 | 로그·복구 / 정방향 / 실선 |
| 경계 | 포함 대상 |
|---|---|
| DB 트랜잭션: 동시 접근 순서·격리 | BEGIN, 재고 읽기·검사, 재고 차감, 주문 행 생성, 불변조건, ROLLBACK, COMMIT, 장애 후 보존 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 거래 시작 BEGIN 안에서 재고 조건을 확인하고 주문 변경을 같은 거래에 둔다. |
|
|
| 차감·삽입 후 재확인 재고 차감과 주문행 생성은 미확정이며 불변조건을 재확인한다. |
|
|
| 대안 1: 조건 통과 COMMIT 같은 미확정 변경의 판정 시작점에서 불변조건을 통과한 경우다. |
|
|
| 대안 2: 오류·불충족 ROLLBACK 미확정 변경의 판정 시작점으로 재설정하여 오류나 조건 불충족을 본다. |
|
|
업무 변경의 완료와 취소를 한 DB 경계에 둔다 · 상태 따라가기
BEGIN 안에서 재고 조건을 확인하고 주문 변경을 같은 거래에 둔다. 모든 단계에서 재고·주문·거래 결정의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
BEGIN 안의 재고 검사·차감·주문 생성은 함께 완료하거나 미확정 변경을 취소한다. 오류나 불변조건 불충족은 ROLLBACK으로, 통과는 COMMIT으로 이어진다. 동시 접근 순서·격리를 경계 안에서 통제하고 커밋 결과를 로그·복구로 보존한다. 외부 결제는 이 취소 경계에 자동 포함되지 않는다.
이 예의 조건
- BEGIN 안의 재고 검사·차감·주문 생성은 함께 완료하거나 미확정 변경을 취소한다. 오류나 불변조건 불충족은 ROLLBACK으로, 통과는 COMMIT으로 이어진다. 동시 접근 순서·격리를 경계 안에서 통제하고 커밋 결과를 로그·복구로 보존한다. 외부 결제는 이 취소 경계에 자동 포함되지 않는다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| BEGIN | 작업 시작 |
| 재고 읽기·검사 | 허용 조건 확인 |
| 재고 차감 | 미확정 변경 |
| 주문 행 생성 | 같은 논리 작업 |
| 불변조건 | 재확인 |
| ROLLBACK | 미확정 변경 취소 |
| COMMIT | 변경 확정 |
| 장애 후 보존 | 완료 확인 결과 / 복구기록 |
| 연결 | 원 라벨·방향 |
|---|---|
| BEGIN → 재고 읽기·검사 | 시작 / 정방향 / 실선 |
| 재고 읽기·검사 → 재고 차감 | 통과 / 정방향 / 실선 |
| 재고 차감 → 주문 행 생성 | 변경 / 정방향 / 실선 |
| 주문 행 생성 → 불변조건 | 재확인 / 정방향 / 실선 |
| 재고 읽기·검사 → ROLLBACK | 오류 / 정방향 / 실선 |
| 재고 차감 → ROLLBACK | 오류 / 정방향 / 실선 |
| 주문 행 생성 → ROLLBACK | 삽입 오류 / 정방향 / 실선 |
| 불변조건 → ROLLBACK | 불충족 / 정방향 / 실선 |
| 불변조건 → COMMIT | 통과 / 정방향 / 실선 |
| COMMIT → 장애 후 보존 | 로그·복구 / 정방향 / 실선 |
| 경계 | 포함 대상 |
|---|---|
| DB 트랜잭션: 동시 접근 순서·격리 | BEGIN, 재고 읽기·검사, 재고 차감, 주문 행 생성, 불변조건, ROLLBACK, COMMIT, 장애 후 보존 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 거래 시작 BEGIN 안에서 재고 조건을 확인하고 주문 변경을 같은 거래에 둔다. |
|
|
| 차감·삽입 후 재확인 재고 차감과 주문행 생성은 미확정이며 불변조건을 재확인한다. |
|
|
| 대안 1: 조건 통과 COMMIT 같은 미확정 변경의 판정 시작점에서 불변조건을 통과한 경우다. |
|
|
| 대안 2: 오류·불충족 ROLLBACK 미확정 변경의 판정 시작점으로 재설정하여 오류나 조건 불충족을 본다. |
|
|
애플리케이션은 함께 지켜야 할 업무변경을 한 경계에 넣고 DBMS는 동시 접근과 복구 메커니즘을 제공한다. 재고 ≥ 0 같은 일관성 조건은 설계자가 제약과 처리순서로 표현해야 하며 커밋 뒤 결과를 어느 장애까지 보존할지도 저장·복구 설정으로 검증한다.
ACID 네 성질은 서로 다른 실패를 막는다
| 성질 | 핵심 질문 | 주문 사례 | 흔한 오해 |
|---|---|---|---|
| 원자성 | 일부만 반영될 수 있는가 | 재고 차감과 주문 생성 전부/전무 | 분산 서비스 전체가 자동 원자적임 |
| 일관성 | 전후 상태가 업무 불변조건을 만족하는가 | 재고가 음수가 아님 | DBMS가 업무규칙을 자동으로 앎 |
| 격리성 | 동시 작업의 중간효과를 어떻게 관찰하는가 | 두 주문의 재고 차감 순서 통제 | 모든 격리수준이 항상 완전 직렬임 |
| 지속성 | 완료 확인 결과가 어떤 장애 뒤에도 남는가 | 커밋 주문의 복구 | 외부 서비스 효과도 함께 보존됨 |
ACID 일관성과 분산 복제본의 관찰 순서를 말하는 일관성은 이름이 같아도 질문이 다르므로 구분한다.
경계와 격리를 강화할수록 경합 비용이 커질 수 있다
업무상 함께 성공해야 할 변경을 너무 작게 나누면 부분 완료가 생기고, 사용자 대기나 외부 호출까지 큰 트랜잭션에 넣으면 잠금 보유시간과 충돌이 늘어난다. 격리 보장을 강화하면 동시 이상을 줄이는 대신 대기·재시작 비용이 커질 수 있다. 먼저 불변조건과 읽기·쓰기 충돌을 식별하고 필요한 보장을 고른다. 외부 결제처럼 한 DB 경계를 넘는 효과는 단계 상태, 중복 방지, 재시도와 보정으로 별도로 관리한다.
사례: 재고 1개를 두 주문이 동시에 읽는다
트랜잭션 A와 B가 모두 재고 1을 읽고 각각 0을 쓰면 두 주문은 승인됐지만 한 번의 차감만 남는 갱신 분실이 생길 수 있다. 재고가 0보다 클 때 한 건 차감을 조건부 갱신 한 문장으로 실행하고 영향받은 행이 1개인지 확인하거나, 해당 재고 행을 갱신할 순서를 잠금으로 직렬화한다. 주문 행 생성까지 같은 트랜잭션에 묶고 오류 시 둘 다 롤백한다. 결제 호출은 장시간 잠금 안에 두기보다 주문의 결제 대기 상태와 요청 식별값·보정 흐름을 설계한다.
보호할 관계는 재고≥0뿐 아니라 승인 주문 수=확정 차감 수, 이 예에서는 재고+확정 차감 수=초기 재고 1이다. 재고 0·주문 2는 첫 조건만 통과하므로 잘못된 승인이다.
| 순서 | 조건부 갱신·주문 처리 | 결과 |
|---|---|---|
| A 실행 | 재고>0 조건으로 1→0, 영향 행 1 | 같은 트랜잭션에서 주문 A 생성 |
| A 커밋 뒤 B 재검사 | 재고 0이라 조건 불충족, 영향 행 0 | 주문 B 승인 안 함 |
| 별도 실패 시험 | A 차감 뒤 주문 삽입 오류 | A 전체 롤백: 재고 1·주문 0 |
실제 DB의 충돌처리는 대기 뒤 조건 재검사 또는 격리수준에 따른 실패·재시도일 수 있다. 조건부 갱신 경로에서는 영향 행 1을 확인하고, 어느 경로든 주문 삽입을 포함한 전체 트랜잭션의 커밋 성공 전에는 승인 응답을 내지 않는다. 외부 결제는 이 표의 롤백 범위에 자동 포함되지 않는다.
자체 10점 문제
트랜잭션과 ACID를 설명하고 동시 주문의 재고 정합성 확보방안을 제시하시오.
요구어는 설명, 제시다. 트랜잭션 경계와 ACID 네 성질을 구분하고 BEGIN–검사·변경–COMMIT/ROLLBACK 흐름을 그린다. 재고 ≥ 0 불변조건, 조건부 갱신 또는 순서 통제, 큰 경계의 경합과 외부 효과 보정을 함께 제시한다.
10점 풀이 방향과 모범답안 보기
답안 목차: 성질–경계–동시성–복구
- 트랜잭션과 ACID 네 성질의 정의
- BEGIN–변경–COMMIT/ROLLBACK 및 복구 흐름
- 업무 불변조건과 트랜잭션 경계 선정
- 동시 접근 이상과 조건부 갱신·격리 통제
- 장기·분산 작업의 단계 상태·멱등·보정 및 시험
답안 도식: ACID와 통제 지점
업무 불변조건으로 DB 트랜잭션의 경계와 분기를 먼저 정한다. 원자성은 커밋/롤백, 일관성은 제약·검사, 격리성은 순서·충돌 통제, 지속성은 로그·복구·확정에 대응한다. ACID 네 성질 표에서 각 실패를 대조하고, 경계 밖 효과는 별도 상태·재시도·보정으로 다룬다.
모범답안 축약본
트랜잭션은 함께 성공하거나 실패해야 할 논리적 작업단위다. ACID는 원자성·일관성·격리성·지속성으로, 전부 반영 또는 취소, 업무 불변조건을 만족하는 상태 이동, 동시 중간효과의 통제, 완료 결과의 장애 후 보존을 뜻한다. 주문에서는 재고 차감과 주문 생성을 한 경계에 두고 검사 뒤 커밋하며 오류 시 롤백한다. 재고 1을 두 작업이 동시에 읽는 갱신 분실은 재고 > 0 조건부 갱신과 영향 행 확인 또는 순서 통제로 막는다. 경계가 너무 크면 잠금·충돌이 늘고 너무 작으면 부분 완료가 생기므로 불변조건과 충돌 범위로 정한다. 외부 결제처럼 한 DB를 벗어난 효과는 ACID만으로 해결되지 않아 단계 상태, 요청 식별값, 재시도와 보정이 필요하다.
자체 25점 문제
재고 1개에 두 주문이 동시에 접근하는 상황에서 트랜잭션 경계와 ACID 보장을 적용해 정합성과 복구 절차를 설계하시오.
요구어는 설계다. 재고 ≥ 0 불변조건을 먼저 고정하고 동시 실행·커밋·롤백·외부 결제 효과를 서로 다른 통제 경계로 나눈다.
25점 풀이 방향과 모범답안 보기
25점 답안 목차
- 업무 불변조건과 트랜잭션 경계
- 재고 검사·차감·주문 생성
- 조건부 갱신 또는 순서 통제
- 원자성의 커밋·롤백
- ACID 일관성과 제약
- 격리성과 동시성 이상
- 지속성과 장애 복구
- 외부 결제의 상태·멱등·보정
25점 답안 도식
앞의 DB 분기 그림에 다음 조건을 적용한다. BEGIN 뒤 재고>0 조건부 차감이 실패하면 ROLLBACK하고, 성공하면 같은 경계에서 주문을 생성해 COMMIT한다. 지속성 확인과 DB 밖 결제 효과는 아래처럼 나누어 검증한다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
앞 그림의 BEGIN·조건부 재고 차감·주문 생성·COMMIT/ROLLBACK을 완료 경계로 삼는다. 커밋 결과는 DB 복구기록으로 지속성을 확인하고 DB 밖 결제는 별도 상태·멱등·보정으로 다룬다. 외부 응답 유실은 DB 롤백으로 자동 취소되는 효과가 아니다.
25점 모범답안
먼저 재고 ≥ 0과 승인된 주문 수=확정 차감 수라는 업무 불변조건을 정한다. 재고 검사·차감과 주문 생성을 하나의 트랜잭션 경계에 두고 재고 > 0인 경우에만 한 건을 차감하는 조건부 갱신을 수행한다. 영향받은 행이 없으면 주문을 승인하지 않고 롤백한다. 또는 같은 재고 행의 갱신 순서를 직렬화해 두 주문이 재고 1을 동시에 승인하지 못하게 한다.
원자성은 재고만 줄고 주문이 없는 부분완료를 막고, ACID 일관성은 커밋 후 재고·키·업무 제약이 유효한 상태를 요구한다. 격리성은 동시 트랜잭션의 중간효과를 통제하고 지속성은 완료를 확인한 결과가 장애 후에도 복구되게 한다. 각 보장은 이름을 나열하는 것이 아니라 실제 실패 시나리오에 대응시킨다.
커밋 전후 장애에서 복구 상태를 직접 따라간다. 아래 추가 복구 사례는 주문 A만 진행하고 다른 주문의 커밋은 없는 구간을 떼어 본 것이다. 시작 상태는 재고 1·주문 A 없음이며, 재고 차감과 주문 생성은 한 DB 트랜잭션이다. 저장매체는 온전하고 영속 커밋 기록의 확정 여부를 판별할 수 있다고 가정한다. 이 조건을 빼면 두 주문 중 누가 먼저 커밋했는지나 매체 손상까지 아래 숫자로 확정할 수 없다.
| 장애 위치 | DB 복구 뒤 상태 | 클라이언트가 할 확인 |
|---|---|---|
| 영속 커밋 확정 전 | 미확정 변경을 함께 취소: 재고 1·주문 A 없음 | 같은 주문 ID의 부재와 현재 재고를 확인한 뒤 조건부 갱신으로 재시도 |
| 영속 커밋 확정 후·성공 응답 전 | 확정 변경을 복구: 재고 0·주문 A 있음 | 같은 주문 ID로 결과 조회, 확정된 주문을 새 주문으로 다시 생성하지 않음 |
응답을 못 받았다는 관찰은 커밋 실패의 증거가 아니다. 복구 기록으로 DB 상태를 정한 뒤 같은 주문 ID로 조회해야 지속성과 재시도 안전성을 함께 설명할 수 있다. 실제 동시 주문 사례에서는 그 사이 다른 주문이 재고를 사용할 수 있으므로 재시도 시점의 조건 검사도 다시 필요하다.
응답 전 장애를 커밋 기록으로 나누어 복구한다 · 상태 따라가기
시작 재고 1·주문 A 없음이며 다른 주문 커밋 없음·저장매체 온전을 가정한다. 모든 단계에서 재고·주문·응답·복구 조회의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
화살표는 응답 전 장애의 복구·확인 순서다. 미확정과 확정은 서로 다른 분기이며, 두 분기 모두 같은 주문 ID 조회로 이어진다. 숫자는 다른 주문의 커밋과 저장매체 손상을 제외한 추가 사례에만 적용한다.
이 예의 조건
- 화살표는 응답 전 장애의 복구·확인 순서다. 미확정과 확정은 서로 다른 분기이며, 두 분기 모두 같은 주문 ID 조회로 이어진다. 숫자는 다른 주문의 커밋과 저장매체 손상을 제외한 추가 사례에만 적용한다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 주문 A 처리 | 재고 차감·주문 생성 / 커밋 전후를 비교 |
| 응답 전 장애 | 클라이언트 결과 미확인 |
| 커밋 기록 확인 | 복구 기록의 확정 여부 |
| 미확정 변경 취소 | 재고 1 · 주문 A 없음 |
| 확정 변경 복구 | 재고 0 · 주문 A 있음 |
| 같은 주문 ID 조회 | 이미 확정: 중복 생성 금지 / 없음: 현재 재고 재검사 |
| 연결 | 원 라벨·방향 |
|---|---|
| 주문 A 처리 → 응답 전 장애 | 장애 / 정방향 / 실선 |
| 응답 전 장애 → 커밋 기록 확인 | 재시작 / 정방향 / 실선 |
| 커밋 기록 확인 → 미확정 변경 취소 | 미확정 / 정방향 / 실선 |
| 커밋 기록 확인 → 확정 변경 복구 | 확정 / 정방향 / 실선 |
| 미확정 변경 취소 → 같은 주문 ID 조회 | 복구 후 조회 / 정방향 / 실선 |
| 확정 변경 복구 → 같은 주문 ID 조회 | 복구 후 조회 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 공통 시작과 제외 조건 시작 재고 1·주문 A 없음이며 다른 주문 커밋 없음·저장매체 온전을 가정한다. |
|
|
| 응답 전 장애 A의 차감·주문 생성 뒤 응답을 받지 못해 커밋 기록 확인이 필요하다. |
|
|
| 대안 1: 커밋 전 미확정 응답 전 장애의 공통 시작점에서 커밋 기록이 없는 경우 미확정 변경을 취소한다. |
|
|
| 대안 2: 커밋 후 확정 응답 전 장애의 공통 시작점으로 재설정하고 커밋 기록이 있는 경우를 복구한다. |
|
|
| 두 분기의 같은 ID 조회 복구 후 같은 주문 ID를 조회한다. 기록이 있으면 기존 결과를 반환하고, 없으면 현재 재고를 재검사한다. |
|
|
응답 전 장애를 커밋 기록으로 나누어 복구한다 · 상태 따라가기
시작 재고 1·주문 A 없음이며 다른 주문 커밋 없음·저장매체 온전을 가정한다. 모든 단계에서 재고·주문·응답·복구 조회의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
화살표는 응답 전 장애의 복구·확인 순서다. 미확정과 확정은 서로 다른 분기이며, 두 분기 모두 같은 주문 ID 조회로 이어진다. 숫자는 다른 주문의 커밋과 저장매체 손상을 제외한 추가 사례에만 적용한다.
이 예의 조건
- 화살표는 응답 전 장애의 복구·확인 순서다. 미확정과 확정은 서로 다른 분기이며, 두 분기 모두 같은 주문 ID 조회로 이어진다. 숫자는 다른 주문의 커밋과 저장매체 손상을 제외한 추가 사례에만 적용한다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 주문 A 처리 | 재고 차감·주문 생성 / 커밋 전후를 비교 |
| 응답 전 장애 | 클라이언트 결과 미확인 |
| 커밋 기록 확인 | 복구 기록의 확정 여부 |
| 미확정 변경 취소 | 재고 1 · 주문 A 없음 |
| 확정 변경 복구 | 재고 0 · 주문 A 있음 |
| 같은 주문 ID 조회 | 이미 확정: 중복 생성 금지 / 없음: 현재 재고 재검사 |
| 연결 | 원 라벨·방향 |
|---|---|
| 주문 A 처리 → 응답 전 장애 | 장애 / 정방향 / 실선 |
| 응답 전 장애 → 커밋 기록 확인 | 재시작 / 정방향 / 실선 |
| 커밋 기록 확인 → 미확정 변경 취소 | 미확정 / 정방향 / 실선 |
| 커밋 기록 확인 → 확정 변경 복구 | 확정 / 정방향 / 실선 |
| 미확정 변경 취소 → 같은 주문 ID 조회 | 복구 후 조회 / 정방향 / 실선 |
| 확정 변경 복구 → 같은 주문 ID 조회 | 복구 후 조회 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 공통 시작과 제외 조건 시작 재고 1·주문 A 없음이며 다른 주문 커밋 없음·저장매체 온전을 가정한다. |
|
|
| 응답 전 장애 A의 차감·주문 생성 뒤 응답을 받지 못해 커밋 기록 확인이 필요하다. |
|
|
| 대안 1: 커밋 전 미확정 응답 전 장애의 공통 시작점에서 커밋 기록이 없는 경우 미확정 변경을 취소한다. |
|
|
| 대안 2: 커밋 후 확정 응답 전 장애의 공통 시작점으로 재설정하고 커밋 기록이 있는 경우를 복구한다. |
|
|
| 두 분기의 같은 ID 조회 복구 후 같은 주문 ID를 조회한다. 기록이 있으면 기존 결과를 반환하고, 없으면 현재 재고를 재검사한다. |
|
|
외부 결제 호출을 긴 DB 잠금 안에 넣지 않는다. 주문을 결제대기 상태로 커밋하고 요청 식별값으로 결제 결과를 확인한 뒤 완료·취소 상태로 전이한다. 응답 유실·재시도·보정은 별도 절차로 시험해 단일 DB ACID가 경계 밖 효과까지 자동으로 되돌린다고 가정하지 않는다.
새 복구 조건을 먼저 판단한다. 위와 같은 DB 조건에서 재고 2개 중 주문 A가 1개를 차감하고 영속 커밋했지만 성공 응답이 유실됐다. 다른 주문은 아직 없다. 복구 뒤 재고·주문 A의 존재, 같은 ID 재조회와 새 ID 주문 생성 중 먼저 할 행동을 설명해 보자.
커밋 후 응답 유실 풀이 확인
확정 변경을 복구하므로 재고는 1개이고 주문 A는 존재한다. 같은 주문 ID로 확정 결과를 조회한다. 응답 유실만 보고 새 ID로 주문을 만들면 남은 1개까지 추가 구매할 수 있으므로 원래 요청의 성공 확인을 대신하지 못한다. 커밋 전 장애로 조건을 바꾸면 미확정 차감과 주문 생성을 함께 취소해 재고 2·주문 A 없음으로 돌아간다.
출처와 적용 경계
트랜잭션과 ACID는 안정된 데이터베이스 기초개념이다. 재고 1개와 두 동시 주문 사례는 원자성·격리성·불변조건을 연습하기 위한 자체 예이며 특정 DBMS의 격리수준·잠금 구현이나 결제 시스템의 운영정책을 뜻하지 않는다.
자기교정과 조건 변경
| 잘못 쓴 답 | 수정 | 복습 |
|---|---|---|
| 트랜잭션은 SQL 한 문장과 같다 | 함께 성공·취소해야 하는 논리적 업무 경계다 | 트랜잭션 |
| ACID 일관성은 여러 복제본이 같은 값을 본다는 뜻이다 | 성공 후 정의된 무결성 제약을 만족하는 상태 이동이다 | ACID |
| 재고 1을 두 주문이 읽어도 둘 다 0을 쓰면 안전하다 | 동시 승인 수와 실제 차감이 어긋나는 갱신 분실을 막아야 한다 | 사례 |
| 트랜잭션 경계는 클수록 안전하다 | 불변조건을 지키는 최소 경계와 경합·지연을 함께 본다 | 교환관계 |
| 외부 결제도 DB 트랜잭션 롤백으로 항상 취소된다 | 경계 밖 효과는 상태·멱등·보정 절차가 필요하다 | 사례 |
재고가 1이 아니라 100이고 한 번에 3개씩 차감한다면? 재고 ≥ 요청수량 조건과 영향행 확인을 같은 원자적 갱신에 넣는다.
주문 생성과 재고 차감을 다른 데이터베이스가 담당한다면? 단일 DB ACID로 전체를 보장한다고 쓰지 말고 완료상태·재시도·보정의 분산 절차를 설계한다.
결제 응답이 30초 걸린다면? 장시간 DB 잠금을 유지하기보다 결제대기 상태와 요청 식별값을 두고 결과 확정 뒤 다음 상태로 전이한다.
한 번에 되찾기
트랜잭션은 함께 성공하거나 실패할 논리적 작업단위이고 ACID는 그 작업의 원자성·일관성·격리성·지속성 보장이다. 경계는 업무 불변조건과 동시성·복구 비용을 함께 보고 정한다.