트랜잭션이란
데이터베이스 시스템에서 트랜잭션이란 하나의 기능을 수행하는 작업 단위입니다.
ACID 원칙은 이러한 트랜잭션의 일관성과 무관성을 지켜주는 핵심 개념입니다.
예를 들어, 상대방에게 이체를 하는 기능이라면 이런 과정을 거치게 됩니다.
- 나의 계좌를 확인한다.
- 계좌에서 잔액을 확인하여 출금한다.
- 상대방의 계좌에 보낸 금액을 입금한다.
이 과정들은 하나로 묶여서 '이체'라는 기능을 수행하고 있고, 이를 하나의 트랜잭션으로 볼 수 있습니다.
하나의 기능을 위해 여러개의 연산 과정을 거치면서 여러 데이터 값을 변경하고 있으므로 정확한 처리가 필요합니다.
여기서 ACID 원칙이 중요한 역할을 합니다.
ACID 원칙
ACID원칙은 다음 네가지 요소로 구성됩니다.
- Atomicity(원자성)
- Consistency(일관성)
- Isolation(고립성)
- Durability(지속성)
구체적인 예시를 통해서 자세히 살펴보겠습니다.
Atomicity(원자성)
원자성이란 트랜잭션 성공 시 모든 연산이 성공적으로 완료되거나, 전혀 실행되지 않아야 함을 말합니다.
화학에서 말하는 원자의 개념처럼 더 이상 쪼개질 수 없고, 존재하거나 혹은 존재하지 않아야 합니다.
위의 예시를 조금 더 구체적으로 하여,
나의 계좌에 100만원이 있었고 상대방 계좌는 0원인 상태에서 상대방에게 50만원을 입금을 한다고 하면
- 나의 계좌에서 100만원을 확인하여 돈을 보낼 수 있는지 확인
- 100만원-50만원을 출금해서 나의 계좌를 50만원을 만듦
- 상대방의 계좌에 50만원이 입금
이 때 만약 2번 과정에서 문제가 생겨 진행이 안되는 경우, 나의 계좌는 50만원이 있고 상대방의 계좌에는 아직 돈이 도착하지 않아 0원일 것입니다. 이는 원자성을 어긴 것이 됩니다.
원자성을 지키기 위해서는 시스템 오류가 발생하면 2번 단계에서 출금이 취소되어야 합니다.
트랜잭션이 성공했다면 나의 계좌 50만원, 상대방 계좌 50만원이 되고, 트랜잭션 실패 시 나의 계좌 100만원, 상대방 계좌 0원이 되어야 합니다.
Consistency(일관성)
일관성은 트랜잭션 실행 후에도 데이터베이스의 제약이나 규칙을 만족해야 함을 뜻합니다.
나의 계좌가 0원이 있는 경우 상대방에게 50만원을 보낼 수는 없습니다.
만약 출금이 된다면 나의 계좌는 -50만원이 될 것이기 때문입니다. 이 경우 '계좌는 항상 0보다 크거나 같아야한다.'는 제약사항을 어겨 일관성을 깬 것이 됩니다.
물론, 나의 계좌가 마이너스 통장이었다면 잔액이 마이너스인 것도 규칙을 만족하므로 일관성을 어기지 않은 것이 됩니다.
즉, '데이터베이스의 제약이나 규칙을 지켰는가?'가 핵심이 됩니다.
Isolation(고립성)
고립성은 트랜잭션 실행 중에 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미합니다.
나의 계좌에 100만원이 있는 상태에서 상대방에게 50만원을 보내려고 하는데, 출금 과정과 동시에 카드값이 100만원이 빠져나갔다고 가정해봅니다.
이 경우 고립성을 지키지 않았다면, 계좌는 0원이 될 수도 있고 50만원이 될 수도 있습니다. 고립성이 지켜지지 않은 경우 제대로 된 계좌 관리가 되지 않게 됩니다. 따라서 이체를 하는 과정에서는 다른 트랜잭션이 끼어들지 못하도록 해야 합니다.
Durability(지속성)
지속성은 트랜잭션이 성공적으로 완료되면 이 결과가 영구적으로 데이터베이스에 반영되어야 함을 의미합니다.
이체 트랜잭션이 성공적으로 완료된 이후 은행측 서버 장애로 인해 서버가 꺼졌다고 가정해봅니다. 지속성이 보장되었다면, 시스템이 복구된 이후에도 이체된 금액이 정확히 반영되어 있어야 합니다.
'CS' 카테고리의 다른 글
JWT(JSON Web Token)에 대한 이해 (0) | 2024.08.05 |
---|---|
인터넷 프로토콜 스택의 4계층, TCP/IP 레이어 (0) | 2024.07.28 |
남에게 설명할 때 비로소 자신의 지식이 된다.
포스팅이 도움되셨다면 하트❤️ 또는 구독👍🏻 부탁드립니다!! 잘못된 정보가 있다면 댓글로 알려주세요.