신뢰할 수 있는 지갑 전송 시스템 설계 및 ACID 보장 pt - 4 (Durability)
발행: (2026년 3월 29일 PM 06:26 GMT+9)
3 분 소요
원문: Dev.to
Source: Dev.to
내구성
내구성은 트랜잭션이 성공적으로 커밋된 후, 시스템 장애가 발생하더라도 그 변경 사항이 데이터베이스에 영구적으로 저장된다는 것을 보장합니다.
스키마
CREATE TABLE accounts (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
balance INT NOT NULL CHECK (balance >= 0),
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
샘플 데이터
INSERT INTO accounts (name, balance)
VALUES ('Alice', 1000), ('Bob', 500);
초기 잔액: Alice = 1000, Bob = 500.
트랜잭션 테스트
BEGIN;
UPDATE accounts
SET balance = balance - 200
WHERE name = 'Alice';
COMMIT;
COMMIT 후, Alice의 잔액은 800이 되며 변경 사항이 영구적으로 저장됩니다.
내구성 검증
- 커밋 직후에 충돌을 시뮬레이션합니다.
- 데이터베이스를 재시작합니다.
- Alice의 잔액을 조회합니다; 여전히 800이어야 합니다.
커밋된 데이터가 재시작 후에도 유지된다면 내구성이 확인된 것입니다.
내구성을 달성하는 방법
- Write‑Ahead Logging (WAL) 은 데이터 파일에 적용되기 전에 변경 사항을 기록합니다.
- 디스크 저장 은 로그와 데이터 페이지가 안정적인 매체에 플러시되도록 보장합니다.
- 충돌 복구 는 시작 시 WAL을 처리하여 아직 디스크에 반영되지 않은 커밋된 트랜잭션을 다시 수행합니다.
이러한 메커니즘은 트랜잭션이 커밋된 후 그 효과가 이후의 어떤 장애에도 살아남도록 보장합니다.