Skip to Content
Suffering builds character

5. 원자성

트랜잭션은 모 아니면 도(All or Nothing)

💡
Tip

원자성(Atomicity) 어원

하나의 트랜잭션은 Atom, 원자와 같이 더 이상 분해될 수 없는 단위인 것처럼 처리되어야 한다는 것

→ 원자성이란, 더 이상 분해될 수 없는 최소한의 작업 단위

따라서 하나의 트랜잭션 내에 존재하는 모든 쿼리(작업 단계)는 전부 성공해야하며, 만약 하나의 쿼리라도 실패할 경우, 이전에 성공했던 모든 쿼리들은 롤백(Rollback)되어야 함

또한 트랜잭션 수행 중에 DB가 다운될 경우, 다운 전까지 성공적으로 수행되었던 모든 쿼리들은 롤백되어야함

1-1. 원자성 정리

정리하면,
원자성이란 하나의 작업 중에 일부 내용만 적용되거나 하는 일이 발생하지 않도록 도와주는 특성이라고 볼 수 있으며,

트랜잭션은 둘 중 하나로 명확해야함

A. 하나의 작업(트랜잭션)을 완전하게 처리하거나,

B. 하나의 작업에서 세부 작업 단계 중에 하나의 단계라도 문제가 발생했을 경우에는 작업 전체를 중지하거나 처음부터 다시 수행하도록 하거나

1-2. 원자성이 보장되지 않는 상황을 가정한 시나리오

다음의 Account 테이블에서 Account 1의 잔액(Balance)에서 2,000원을 Account 2에게 이체한다고 가정

Account 테이블
ACCOUNT_IDBALANCE
110,000
25,000
sql
BEGIN; -- 트랜잭션 시작 -- Account 1의 잔액이 2,000원 이상인지 조회 SELECT BALANCE FROM ACCOUNT WHERE ACCOUNT_ID = 1; -- Account 1의 잔액 2000원 출금 UPDATE ACCOUNT SET BALANCE = BALANCE - 2000 WHERE ACCOUNT_ID = 1; -- (?)Database down.

Database가 다운되어 서버를 재 시작(restart) 후 Account 1의 잔액 조회

sql
SELECT BALANCE FROM ACCOUNT WHERE ACCOUNT_ID = 1;

조회 결과,

ACCOUNT_IDBALANCE
18,000 (?)
25,000

→ 원자성이 보장되지 않으면 데이터의 일관성(Consistency)도 깨지게 됨

Last updated on