[DB] 군대로 알아보는 트랜잭션 - 2. 일관성 편

7199 단어 DatabaseDatabase

1. 일관성(Consistency)이란?

일관성의 사전정 정의는 다음과 같습니다

  • 일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다. (출처)

  • 인터넷에서 트랜잭션의 일관성에 대해 검색하면 나오는 예시가 송금입니다.
    A의 잔고 + B의 잔고 = 100만원일 때, 송금 후에도 A의 잔고 + B의 잔고 = 100만원이어야 합니다.

  • 이 뿐 아니라 잔고는 0보다 작을 수 없다, 잔고는 항상 숫자여야 한다 등 데이터베이스가 가지고 있는 제약조건들이 트랜잭션 전후로 지켜지는 것 또한 트랜잭션의 일관성입니다.


2. 트랜잭션의 일관성이 지켜지지 않는다면

지난 번 예시를 이어서 사용하도록 하겠습니다. 다만, 이번에는 입대 신청을 하면 군대에서 10,000원을 준다고 가정하겠습니다. 이때 DB에 문제가 발생해서, 송금 트랜잭션의 원자성이 지켜지지 않고 있습니다.

class MilitaryDB{
    HashSet<String> newSoldiers = new HashSet<>();
    int budget = 10_000;

    public void 입대(Citizen citizen) {
        newSoldiers.add(citizen.name);
        송금(citizen);
    }

    public void 송금(Citizen citizen) {
        budget -= 10_000;
        if(네트워크_에러_발생()) {
            System.out.println("=====Network Failure=====");
        } else {
            citizen.balance += 10_000;
        }
    }

    private boolean 네트워크_에러_발생() {
        if(2*Math.random() > 1) 
            return true;
        else 
            return false;
        
    }

    public void 국가의_부름에_답하라() {
        for (String name : newSoldiers) {
            System.out.println("2022년 3월 23일까지 논산훈련소로 오도록, 훈련병 " + name);
        }
    }
}

class Citizen {
    String name;
    int balance;

    public Citizen(String name, int balance) {
        this.name = name;
        this.balance = balance;
    }
}

위와 같은 상황이 발생할 경우, 일관성이 지켜지지 않았다고 말할 수 있습니다.
이렇듯 트랜잭션의 원자성이 지켜지지 않을 경우, 트랜잭션의 일관성도 지켜지지 않을 확률이 높아집니다.

좋은 웹페이지 즐겨찾기