"트랜잭션은 하나의 작업 단위라고 하는데, 그렇다면 트랜잭션이란 무엇일까?"
이번 글에서는 데이터베이스에서 중요한 개념인 트랜잭션의 개념에 대해 알아보겠습니다.
(단, 트랜잭션 격리 수준은 좀 더 깊은 주제이므로, 이 글에서는 다루지 않고 다음 글에서 자세히 알아보겠습니다)
"트랜잭션이란 무엇일까요?"
트랜잭션(Transaction)
트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다.
또한, 데이터베이스의 상태를 바꾸기 위해 수행하는 작업 단위 또는 일련의 연산을 의미합니다.
"작업 단위가 어떤 작업 단위를 말하나요?"
DB에서 작업 단위는 하나의 쿼리 묶음이라고 생각하면 됩니다.
쇼핑몰 예시와 쿼리문을 통해 작업 단위를 알아보겠습니다.
쇼핑몰에서 결제가 이루어지는 일반적인 흐름은 다음과 같습니다.
(하나의 예시일 뿐 실제 쇼핑몰에서 완전히 아래와 같은 플로우로 진행되지 않습니다.)
1. 상품 결제
2. 재고 차감
3. 결제 내역 저장
각 단계는 독립적인 작업을 의미하며, 이를 모두 하나로 묶어 처리하는 단위를 작업 단위라고 합니다.
즉, 상품 결제, 재고 차감, 결제 내역 저장은 하나의 트랜잭션으로 간주됩니다.
"작업단위는 쿼리 묶음이라 했으니, 쿼리문을 볼까요?"
BEGIN TRANSACTION; // 트랜잭션 시작
UPDATE users SET balance = balance - 50000 WHERE user_id = 1; // 1. 상품 결제
UPDATE products SET stock = stock - 1 WHERE product_id = 101; // 2. 재고 차감
INSERT INTO orders (user_id, product_id, amount) VALUES (1, 101, 50000); // 3. 주문 내역 작성
COMMIT; // 커밋
쿼리문에서 여러 작업을 하나의 트랜잭션으로 묶기 위해 BEGIN TRANSACTION 명령어를 사용합니다. 이를 통해 이후에 실행되는 쿼리문들이 하나의 작업 단위로 처리되도록 합니다.
트랜잭션 특징
트랜잭션은 ACID라는 4가지 특징을 가집니다. 각 특징에대해 정리하면 다음과 같습니다.
ACID
원자성(Atomicity) : 트랜잭션이 데이터베이스에 완전히 반영되거나 아예 실행되지 않아야 합니다.
일관성(Consistency) : 트랜잭션이 실행되기 전과 실행된 후의 데이터가 항상 유효한 상태를 유지해야 합니다.
독립성(Isolation) : 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들 수 없습니다.
영속성(Durability) : 완료한 트랜잭션의 결과가 데이터베이스에 영구적으로 반영됩니다.
왜 4가지 특성이 존재해야 할까요?
각각 특성이 지켜지지 않는 상황과 지켜진 상황의 비교를통해 알아보겠습니다.
먼저, 원자성에 대한 예시를 보겠습니다.
쇼핑몰에서 어떤 사용자가 상품을 구매버튼을 눌렀습니다. 사용자가 구매버튼을 누른 직후, 서버에서 결제처리가 되어 계좌에서 돈은 빠져나갔지만, 상품 주문처리에서 오류가 발생하게 되었습니다.
(현재 서버에서는 결제와 상품 주문이 하나의 트랜잭션 단위로 묶여 있습니다.)
"원자성이 지켜지지 않을 경우엔 어떻게 될까요?"
원자성이 지켜지지 않으면, 결제는 정상적으로 이루어졌지만 주문 처리는 오류로 인해 진행되지 않는 문제가 발생할 수 있습니다.
"원자성이 지켜지는 경우엔 어떻게 될까요?"
원자성이 보장되면 결제와 주문 둘 중 하나라도 실패하면 전체가 취소됩니다.
즉, 결제가 정상적으로 이루어졌다면 주문도 반드시 처리되고, 반대로 주문 처리 중 오류가 발생하면 결제도 함께 취소됩니다.
이것이 트랜잭션의 원자성입니다.
일관성에 대한 예시를 보겠습니다.
쇼핑몰 관리자가 새로운 상품을 추가하기 위해 상품 추가버튼을 눌렀습니다.
관리자가 상품추가 버튼을 누른 직후, 서버에서 상품 정보를 저장했지만, 상품의 재고 상태 갱신시 오류가 발생하게 되었습니다.
(현재 서버에서는 상품 정보 저장과 재고 상태 갱신이 별도의 트랜잭션으로 처리되고 있습니다.)
"일관성이 지켜지지 않을 경우엔 어떻게 될까요?"
상품 정보는 DB에 저장이 되었지만, 동일 상품에 대한 재고 정보가 없으므로, 소비자가 해당 상품 조회시 재고가 존재하지 않기때문에 구매를 할 수 없게 됩니다.
"일관성이 지켜지는 경우엔 어떻게 될까요?"
일관성이 보장되면 상품 정보 저장과 재고 상태 갱신이 하나의 트랜잭션으로 처리되므로, 두 작업이 모두 성공해야만 데이터베이스에 반영됩니다. 즉, 재고 상태 갱신이 실패하면, 상품 정보도 함께 롤백되므로 소비자가 상품을 조회했을 때 "재고 없음" 같은 불완전한 상태가 발생하지 않습니다.
독립성에 대한 예시를 보겠습니다.
쇼핑몰에 이벤트로 인해 50% 할인 중인 상품이 1개 있습니다. 두명의 유저가 동시에 할인 중인 상품 구매하기 버튼을 눌렀습니다.
(현재 서버에서는 상품 재고를 확인하고, 구매를 진행하는 작업이 하나의 트랜잭션으로 묶여 있습니다.)
"독립성이 지켜지지 않을 경우엔 어떻게 될까요?"
두 명의 유저가 동시에 할인 상품을 구매하려고 할 때, 각각의 트랜잭션에서 상품 재고를 확인하는 과정은 다음과 같이 실행됩니다.
- 두 트랜잭션이 동시에 실행되면서, 각각 상품 재고가 1개라고 인식합니다.
- 각 트랜잭션이 재고가 충분하다고 판단하여 구매를 진행합니다.
- 결과적으로, 재고가 1개뿐인데 2건의 구매가 발생하는 문제가 발생합니다.
이처럼 트랜잭션 간의 독립성이 지켜지지 않으면 데이터 충돌이 발생하여 재고 초과 판매와 같은 문제가 생길 수 있습니다.
"독립성이 지켜지는 경우엔 어떻게 될까요?"
독립성이 보장되면, 각 트랜잭션이 다른 트랜잭션의 영향을 받지 않도록 순차적으로 실행되거나, 동시에 실행되더라도 데이터 정합성이 유지됩니다.
- 첫 번째 유저의 트랜잭션이 실행되면, 상품 재고를 확인하고 구매를 진행하는 동안 다른 트랜잭션은 대기하거나 접근할 수 없습니다.
- 첫 번째 트랜잭션이 재고를 차감하고, 두 번째 트랜잭션이 실행됩니다.
- 두 번째 트랜잭션이 실행될 때, 재고가 이미 0개로 업데이트되었으므로 구매할 수 없는 상태가 됩니다.
즉, 두 개의 트랜잭션이 동시에 실행되더라도 하나의 트랜잭션이 완료되기 전까지 다른 트랜잭션이 동일한 데이터를 변경하지 못하도록 보장하는 것이 트랜잭션의 독립성입니다.
영속성에 대한 예시를 보겠습니다.
쇼핑몰에서 한 사용자가 상품을 구매하고 결제를 완료했습니다. 결제 과정이 끝난 후, 서버가 갑자기 다운되었거나 오류가 발생하여 강제 종료되었습니다.
(현재 서버에서는 결제 정보를 데이터베이스에 저장한 후, 트랜잭션을 커밋합니다.)
"영속성이 지켜지지 않은 경우엔 어떻게 될까요?"
서버가 종료되거나 오류가 발생할 경우, 결제 정보가 데이터베이스에 영구적으로 저장되지 않으면 결제 내역이 사라질 수 있습니다.
이처럼, 트랜잭션이 완료되었음에도 데이터베이스에 정보가 영구적으로 반영되지 않으면, 서버 장애 발생 시 데이터 유실이 일어날 수 있습니다.
"영속성이 지켜지는 경우엔 어떻게 될까요?"
영속성이 보장되면, 트랜잭션이 성공적으로 커밋된 이후에는 어떤 장애가 발생하더라도 데이터가 안전하게 저장됩니다.
즉, 트랜잭션이 성공적으로 완료된 후에는 데이터가 반드시 영구적으로 저장되어야 하며, 시스템 오류로 인해 손실되지 않는 것이 트랜잭션의 영속성입니다.
이렇게 트랜잭션의 4가지 특징에 따른 예시를 살펴봤습니다.
다음으로, 트랜잭션을 제어하는데 사용하는 명령어를 알아보겠습니다.
TCL(Transaciton Control Language)
트랜잭션을 제어하기 위해 사용하는 명령어의 종류는 다음과 같습니다.
COMMIT : 트랜잭션이 정상적으로 종료되어 DB에 변경 사항을 반영하는 명령어 입니다.
ROLLBACK : 트랜잭션이 비정상적으로 종료되어 트랜잭션이 수행한 변경 사항을 취소하고 DB를 이전 상태로 되돌리는 명령어 입니다.
SAVEPOINT : 트랜잭션에서 특정 지점을 지정하는 명령어로, ROLLBACK과 함께 사용하면 해당 지점까지 되돌릴 수 있습니다.
트랜잭션이 수행되는 단계를 도식화 하면 다음과 같습니다.
활성화 : 트랜잭션이 시작되어 처리 중인 상태를 나타냅니다.
부분적 완료 : 트랜잭션의 마지막 연산까지 처리가 완료되었지만 DB에 트랜잭션 수행 결과가 반영되지 않은 상태입니다.
완료 : 트랜잭션의 연산 처리가 완료되고 데이터베이스에 결과가 반영된 상태입니다.
실패 : 트랜잭션 처리 중 오류가 발생해 트랜잭션이 중단된 상태입니다.
철회 : 트랜잭션이 중단되어 ROLLBACK을 수행해 DB를 이전으로 되돌린 상태입니다.
정리
- 트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다.
- 트랜잭션은 A(원자성),C(일관성),I(독립성),D(영속성)라는 4가지 특징을 가집니다.
- TCL은 COMMIT, ROLLBACK, SAVEPOINT가 있습니다.
'CS' 카테고리의 다른 글
[네트워크] TCP 제어 방법 (0) | 2025.02.15 |
---|---|
프로세스와 스레드 (2) | 2025.02.12 |
[네트워크]TCP/IP & HandShaking (0) | 2025.02.01 |
[네트워크] OSI 7계층 (2) | 2025.01.27 |
[운영체제] 스케줄링 (0) | 2024.11.26 |