공부방

트랜잭션과 ACID 원칙 본문

백엔드/DB

트랜잭션과 ACID 원칙

코딩 화이팅 2025. 3. 25. 14:07

트랜잭션이란?

  • 데이터베이스에서 한 번에 처리돼야 할 작업 묶음
  • 쉬운 예 : 자판기에 돈을 넣고 -> 음료 고르고 -> 음료 나오는 이 전체 과정이 하나의 트랜잭션
  • 다 성공하거나 하나라도 실패하면 전부 취소해야한다.
    • 은행에서 송금할 때 내 계좌에서 만원 출금, 친구 계좌에 만원 입금한다고하면 이게 한 트랜잭션
    • 하나라도 실패하면 돈이 사라지거나, 중복되면 안 되기 때문에 반드시 둘 다 성공하거나, 모두 취소(rollback) 해야한다.

Commit 연산

  • 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 끝났다 라는 것을 알려주기 위해 사용하는 연산
  • Commit을 하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션 단위로 하는 것을 도와준다.

Rollback 연산

  • 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다.
  • 후에 사용자가 트랜잭션 처리된 단위대로 Rollback을 진행할 수도 있다.

트랜잭션의 작동 방식

  1. 트랜잭션 시작(Begin Transaction)
  2. 내가 하려는 작업 수행(계좌에서 돈 빼기, 넣기 등)
  3. 문제 없으면 -> 커밋(Commit)
    이제 결과를 진짜 DB에 저장
  4. 문제 생기면 -> 롤백(Rollback)
    아예 처음 상태로 돌려버림

트랜잭션 격리 수준(Isolation Level)

  • 여러 사람이 동시에 데이터베이스를 건드릴 때 서로 꼬이지 않게 하는 방지 수준
  • 예시
    • 친구와 함께 1개 남은 라면을 동시에 사려고 한다.
    • 내가 먼저 라면이 있는지 확인해보는 트랜잭션 시작
    • 친구도 라면이 있는지 확인하는 트랜잭션 시작
    • 둘 다 사면 재고가 꼬인다.
  • 이런 상황을 막기 위해 '격리 수준'을 조절하는 것.
  • READ UNCOMMITTED : 다른 사람이 아직 확정(커밋) 안 한 정보도 볼 수 있다. -> 제일 위험
  • READ COMMITTED : 커밋된 정보만 볼 수 있다 (조금 안전)
  • REPEATABLE READ : 한 번 읽은 데이터는 계속 똑같게 보인다. (일관성 유지)
  • SERIALIZABLE : 완전 순차적으로 처리 -> 가장 안전하지만 느리다.
  • 보통 READ COMMITTED, REPEATABLE READ 많이 쓴다.

트랜잭션에서 생기는 문제들

  • Dirty Read(더러운 읽기) : 다른 사람이 아직 커밋도 안 한 값을 내가 읽어버림
  • Non-Repeatable Read(반복 불가 읽기) : 읽었는데 다시 읽었더니 값이 바뀜
  • Phantom Read(유령 읽기) : 조건은 같은데, 똑같은 쿼리인데 데이터가 늘어나 있다.
  • 이 문제들은 Isolation Level로 막을 수 있다.

ACID 원칙이란?

트랜잭션이 제대로 작동하기 위한 4가지 규칙

A - 원자성(Atomicity)

  • 트랜잭션은 모두 성공 또는 모두 실패 해야한다.
  • 예 : 도시락을 쌀 때 반, 반찬, 김치 전부 넣어야 완성된 도시락이지만, 반찬을 다 빠뜨리게 되면 도시락이라고 하기 어렵다.
  • 즉, 중간에 실패하면 모든 걸 취소

C - 일관성(Consistency)

  • 트랜잭션이 끝나면 데이터는 항상 정해진 규칙(제약조건)을 만족해야 한다.
  • 예 : 누군가에 계좌에 -5000원 이라는 금액은 있을 수 없다.
    이처럼 트랜잭션이 끝났을 때 이상한 상태가 되면 안된다.
  • 모든 규칙을 지키는 상태로 유지

I - 고립성(Isolation)

  • 동시에 여러 트랜잭션이 실행돼도 서로 간섭하면 안된다.
  • 예 : 쇼핑몰에서 옷을 사고 있는데 동시에 다른 사람이 같은 옷을 구매하면, 재고 꼬임, 중복 주문이 발생할 수 있다.
  • 즉, 트랜잭션은 자기 일 끝나기 전까진 다른 트랜잭션이 못 끼어들게 해야 한다.

D - 지속성(Durability)

  • 트랜잭션이 성공하면, 결과는 절대 날아가지 않는다.
  • 예 : 은행에서 10만원 송금 완료 후 갑자기 정전이 됐다?
    => 그래도 돈은 무조건 송금돼 있어야 한다.
  • 성공한 트랜잭션은 디스크에 안전하게 저장돼야 한다.

'백엔드 > DB' 카테고리의 다른 글

DB 인덱스의 동작 원리와 성능 개선  (0) 2025.03.25
DB 클러스터링  (0) 2025.03.19
데이터 이중화  (0) 2025.03.19
분산 데이터베이스(Distributed Database)  (0) 2025.03.19
Tibero  (0) 2025.03.19