트랜잭션의 일관성과 지속성은 무슨 차이일까?

Alex·2025년 3월 6일
0

CS를 공부하자

목록 보기
46/74

Consistency와 Durability가 정확히 어떤 차이가 있는건지 감이 잘 안잡힌다.

위키 백과에 따르면,

지속성은 어떠한 규칙에 대한 개념으로 보인다 즉, 제약조건, cascade같은 관계에 대한 제약조건을 지키는 것을 말하는 것으로 보인다.

일관성이 지켜지지 않는 사례를 한번 봐보자.
a+b=100이라는 기본 전제가 있다고 해보자. 이때, a에서 10을 빼고 b를 변경하지 않는다면?

이때 validation검사가 발생해서 a+b=100이 아니네? 기존의 데이터베이스 rule과는 일치하지 않아. 라고 판단을 하게 된다.

여기서는 숫자와 관련된 이야기를 했지만, 외래키 제약조건같은 여러 제약사항들을 트랜잭션의 결과가 준수하는지를 확인한다는 개념으로 보면 될 거 같다.

데이터 타입으로, Integer를 정의해놨는데 여기에 13.5라는 소수를 넣으면 이것 역시 기존의 데이터베이스 rule과 맞지 않을 것이다.

이러한 개념을 Consistency라고 한다.

그렇다면지속성이란 무엇인가? 지속성은 트랜잭션이 한번 db에 반영되면 그 결과가 계속 유지돼야 한다는 뜻이다.

Consistency와는 개념적으로 다르다. 번역이나 늬앙스의 문제로 헷갈렸던 것으로 보인다.

Durability의 failure 사례를 한번 봐보자. a에서 b로 현금 10만원을 옮겼을 때, 이는 b에 10이 추가가 된다는 뜻이다. 트랜잭션이 성공적으로 반영됐는데, 만약 그 변화된 내역이 여전히 디스크 버퍼에 있는 큐에서 대기중이라면? 이때 전력이 나가서 db에 내역이 반영되지 않을 수 있다. 그런 경우를 Durability failure라고 한다.

이 참에 원자성, 격리성 내용도 정리해보자

원자성은 뭐야?

원자성은 모든 트랜잭션을 Single unit(단 하나의 유닛-개체)가 되게끔 보장한다. 쉽게 생각하면, success or fail 양자택일만 가능한 상황이다.

트랜잭션은 보통 여러개의 sql 구문으로 이뤄지는데, 이때 중간에 하나가 어떤 오류를 만나 실패하면 전체 트랜잭션을 취소해버려야 한다. 이는 db에 실제로 반영된(아직 commit은 안된)것들을 취소하는 것까지 포함한다.

원자성의 실패 사례는, a가 돈을 b에게 보낼 때 1만원을 a 계좌에서 인출했지만 b계좌로는 송금하지 않은 채로 트랜잭션이 끝나버리는 상황을 예로 들 수 있다.

격리성은 뭐야?

트랜잭션은 동시다발적이다. 즉, 한번에 여러 트랜잭션이 실행될 수 있다. 격리성은, 여러개의 트랜잭션이 동시에 실행되더라도 이게 순차적으로 실행하는 것과 같은 상태를 말한다.

되게 어렵게 꼬았지만, 그냥 트랜잭션들끼리 서로 영향을 주지 않아야 한다는 뜻이다.

두개의 트랜잭션이 동시에 실행된다고 해보자. 이 두개는 같은 데이터를 수정한다. 이때는 하나의 트랜잭션이 다른 트랜잭션이 끝날 떄까지 대기를 해야 격리성을 유지할 수 있다.

a에서 b로 10만원을 보내고, 다시 20만운을 보낸다고 해보자.
이때 동시에 보내면 동시성 문제가 발생해서, 10만원을 보낸 내역이 사라질 수 있다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글