본문 바로가기
공부 및 정리/기타 정리

트랜잭션과 ACID

by 스파이펭귄 2024. 3. 5.
728x90

데이터베이스를 공부하다 ACID와 트랜잭션에 대해서 공부하게 되어 간단히만 정리해본다.

데이터베이스에서 트랜잭션(Trasaction)이란 “쪼갤 수 없는 업무 처리의 최소 단위”를 의미한다.

예를 들어 아래와 같은 상황이 있다고 하자.

  1. A라는 사람이 B에게 1000원을 지급한다.
  2. B가 그 돈을 받는다

이러한 상황은 송금과 같은 것으로도 생각할 수 있다. A가 B에게 돈을 보내면 B의 계좌에는 돈이 들어와야만 한다. 만약 A가 돈을 보냈음에도 B의 계좌에 돈이 들어오지 않는다면 이건 큰 문제가 된다. 이러한 경우 다시 A의 계좌에 돈이 원상 복구 되어야 한다.

즉, 위 과정은 하나의 쪼갤 수 없는 단위로 보아야 하며 이를 데이터베이스에서는 트랜잭션이라 한다.

데이터 베이스에서는 이러한 트랜잭션의 처리가 정상적으로 완료된 경우 커밋(Commit)을 하며, 오류가 발생하는 경우엔 원래 상태로 되돌리기 위해 롤백(Rollback)을 하게 된다.

  • Commit: 아직 저장되지 않은 데이터를 DB에 저장하고, 트랜잭션을 종료시키는 명령어
  • Rollback: 만약 트랜잭션 도중 오류가 발생하게 되면 오류가 발생하기 이전 상태로 되돌리는 명령어로 이를 통해 DB는 오류 이후에도 꺠끗한 사본으로 복원할 수 있기에 무결성을 보장해준다.

 

ACID

트랜잭션은 결국 커밋되거나 롤백이 된다. 이러한 트랜잭션이 안전하게 수행되기 위해서는 ACID라는 4가지 조건을 충족해야 한다.

Atomicity (원자성)

All or Nothing

트랜잭션이 All or Nothing 방식으로 처리되어야 함을 의미하는 속성으로 트랜잭션 내의 모든 연산이 성공적으로 수행이 완료되어야만 최종적으로 DB에 반영되는 것을 보장하는 속성을 의미한다. 즉, 트랜잭션을 더 이상 쪼갤 수 없는 업무 단위로 만드는 속성이다.

만약 트랜잭션 내 어떤 연산이라도 실패하는 경우 같은 트랜잭션 내에서 수행한 연산을 모두 취소하고 트랜잭션 실행 이전 상태로 DB를 복원해야한다.

이러한 속성을 지킴으로써 트랜잭션이 완벽히 수행되거나 아예 수행되지 않음을 보장하여 데이터 무결성과 일관된 시스템 상태를 유지한다.

구현 시 아래 기능들이 사용된다.

  • 롤백 매커니즘: 트랜잭션 중 오류가 발생시 이미 실행한 연산을 취소하는 매커니즘
  • 로킹(Locking): 동시에 여러 트랜잭션이 수행될 때, 데이터 항목 접근을 제어하기 위해 로킹을 사용한다.
  • 로그 기록

 

Consistency (일관성)

일관성은 트랜잭션 수행 전후 DB가 일관된 상태를 항상 유지해야 한다는 것이다.

일관된 상태라는 말이 어려운데 트랜잭션 전의 상태와 후의 상태는 당연히 다르지만 각각은 일관된 상태라는 의미이다.

이러한 일관된 상태의 핵심 요소는 다음과 같은 것들이 있다.

  • 데이터 무결성: 기본키, 외래키 제약 조건등은 트랜잭션 이후로도 만족되어야 한다.
  • 비즈니스 규칙 준수: 트랜잭션이 비즈니스 로직과 규칙을 준수해야한다. 만약 A가 B에게 돈을 보냈을 때 A, B 두 계좌의 돈의 총합은 같아야 한다.
  • 스키마 일관성: 특정 필드에 적절한 데이터만이 삽입되어야한다. Varchar인 필드에 Int가 삽입되는 경우는 방지되어야 한다.

구현시 아래 기능들이 사용된다.

  • 제약: 테이블 생성시 제약 조건을 통해 일관성을 강제한다.
  • 응용 프로그램 로직: 외부 프로그램으로 데이터 입력이나 업데이트 발생시 추가적인 비즈니스 규칙을 만들 수 있다.

 

Isolation (고립성)

고립성은 동시에 실행되는 여러 트랜잭션이 서로에게 영향을 주지 않고 독립적으로 실행되는 속성을 의미한다. 각 트랜잭션의 중간 결과들을 고립시켜 각 트랜잭션이 시스템을 단독으로 사용하는 것처럼 행동하게 보장하며, 일관성 있는 데이터 보기와 안정성과 무결성을 제공한다.

여러 트랜잭션이 서로에게 영향을 주지 않게 만들기에 데이터 무결성이 유지되며, 동시에 여러 트랜잭션을 수행할 수 있어 동시성이 향상된다.

Transaction Isolation Level

이때 고립성의 수준에 따라 다음과 같이 나누게 된다.

  1. Read Uncommitted: 가장 낮은 고립성 수준으로 한 트랜잭션이 작동중인 데이터를 다른 트랜잭션이 읽을 수 있음. → Dirty Read가 발생 가능
  2. Read Committed: 커밋이 완료된 데이터만 다른 트랜잭션이 읽을 수 있음 → Dirty Read 방지, Non-Repeatable Read 발생 가능
  3. Repeatable Read: 한 트랜잭션 내에서 같은 데이터를 여러번 읽을 때 항상 동일한 데이터를 반환하도록 보장. → Phantom Read가 발생 가능. (업데이트 이전 데이터가 읽히는 것)
  4. Serializable: 가장 높은 고립성 수준으로 트랜잭션이 순차적으로 실행되는 것을 보장해 모든 읽기 문제를 방지하나 동시성은 가장 낮음.

결국 고립성과 동시성은 Trade off가 존재한다고 볼 수 있다.

위에서 이야기한 Dirty Read와 Non Repeatable Read, Phantom Read는 아래 좋은 블로그 글이 있어 공유한다.

[DB] Dirty Read, Non-Repeatable Read, Phantom Read 예시 및 Snapshot Isolation Level | LIM

 

[DB] Dirty Read, Non-Repeatable Read, Phantom Read 예시 및 Snapshot Isolation Level | LIM

DB의 Transaction 들이 동시에 실행될 때 발생할 수 있는 이상 현상들에 대해 정리하고 예시를 통해 더 자세히 파악해보고자 한다. 이전에 Transaction Isolation Level 에 대해서는 정리해 둔 포스팅이 있다

amazelimi.tistory.com

구현시 아래 기능들을 이용한다.

  • 로킹(Locking)
  • 멀티 버전 동시성 제어

 

Durability (지속성)

지속성은 커밋 후 그 결과가 영구적으로 DB에 작업의 결과가 반영되어야 하며, 일단 커밋이 되면 이후 시스템에 장애가 발생하더라도 그 결과는 영구적으로 유지되어야 함을 의미한다.

이를 통하여 데이터의 신뢰성을 보장하고, 시스템 복구 시 안정적이고 빠르게 복구 할 수 있다.

구현 시 아래 기능들이 사용된다.

  • 로그 기반 복구
  • 체크 포인트
  • 데이터 복제
  • 분산 스토리지

 

Reference

728x90

'공부 및 정리 > 기타 정리' 카테고리의 다른 글

[SQL] DELETE, TRUNCATE, DROP  (0) 2024.04.24
동기, 비동기, Blocking, Non-Blocking  (0) 2024.04.14
CAP 정리  (1) 2024.03.06
스프링-MYSQL 프로젝트 EC2에 올리기  (2) 2024.02.06
Docker with WSL  (0) 2023.04.16