[DB] 군대로 알아보는 트랜잭션 - 2. 일관성 편
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;
}
}
위와 같은 상황이 발생할 경우, 일관성이 지켜지지 않았다고 말할 수 있습니다.
이렇듯 트랜잭션의 원자성이 지켜지지 않을 경우, 트랜잭션의 일관성도 지켜지지 않을 확률이 높아집니다.
Author And Source
이 문제에 관하여([DB] 군대로 알아보는 트랜잭션 - 2. 일관성 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mincho920/DB-군대로-알아보는-트랜잭션-2.-일관성-편저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)