일관성의 사전정 정의는 다음과 같습니다
일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다. (출처)
인터넷에서 트랜잭션의 일관성에 대해 검색하면 나오는 예시가 송금입니다.
A의 잔고 + B의 잔고 = 100만원일 때, 송금 후에도 A의 잔고 + B의 잔고 = 100만원이어야 합니다.
이 뿐 아니라 잔고는 0보다 작을 수 없다, 잔고는 항상 숫자여야 한다 등 데이터베이스가 가지고 있는 제약조건들이 트랜잭션 전후로 지켜지는 것 또한 트랜잭션의 일관성입니다.
지난 번 예시를 이어서 사용하도록 하겠습니다. 다만, 이번에는 입대 신청을 하면 군대에서 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;
}
}
위와 같은 상황이 발생할 경우, 일관성이 지켜지지 않았다고 말할 수 있습니다.
이렇듯 트랜잭션의 원자성이 지켜지지 않을 경우, 트랜잭션의 일관성도 지켜지지 않을 확률이 높아집니다.