본문 바로가기

데이터베이스

[데이터베이스] 트랜잭션의 ACID 성질


트랜잭션(Transaction)이란?

트랜잭션(Transaction)이란 여러 개의 작업을 하나로 묶은 실행 유닛을 말합니다.

트랜잭션은 데이터베이스의 상태를 변환시키는 기능을 수행하기 위한 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위를 말합니다.

트랜잭션은 아래와 같은 특징을 가지고 있습니다.

  • 각 트랜잭션은 하나의 특정 작업으로 시작을 해서 묶여 있는 모든 작업들을 다 완료하여야 정상적으로 종료됩니다.
  • 만약 하나의 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업물이라도 실패하면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단합니다.
  • 작업이 하나라도 실패하게 되면 트랜잭션도 실패이고, 모든 작업이 성공적이면 트랜잭션 또한 성공입니다.
  • 성공 또는 실패라는 두 개의 결과만 존재하는 트랜잭션은, 미 완료된 작업 없이 모든 작업을 성공하여야 합니다.

데이터 베이스 트랜잭션은 ACID라는 특성을 가지고 있습니다.

 


ACID

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(Transaction)의 안정성을 보장하기 위해 필요한 성질입니다.

 

 


Atomicity(원자성)

원자성은 트랜잭션이 안전성을 보장하기 위해 가져야 할 성질 중의 하나입니다.

이는 하나의 트랜잭션의 연산들이 모두 성공하거나, 반대로 모두 실패되는 성질을 말합니다. 

즉, 작업이 모두 반영되거나 모두 반영되지 않음으로써 결과를 예측할 수 있어야 합니다.

 

아래의 예제를 통해 설명해보도록 하겠습니다.

 

 

계좌이체를 할 때는 다음과 같은 두 단계가 있습니다.

  1. 은행 A에서 돈을 출금합니다.
  2. 은행 B에 돈을 입금합니다.

하지만 계좌 이체를 하려는데 은행 A에서는 출금을 하고, 은행 B에는 입금이 되지 않았다고 가정해 봅시다.

위와 같은 상황에서 어디서 문제가 발생했는지 파악할 수 없다면, 출금된 돈은 세상에서 사라지는 돈이 돼버립니다.

 

은행 A에서는 출금하는 일에 성공했지만, 은행 B에서 입금하는 작업에 실패한다면 은행 A에서 출금하는 작업을 포함하여 모든 작업이 실패로 돌아가야 한다는 것이 Atomicity(원자성)입니다.

 

SQL도 마찬가지로, 특정 쿼리를 실행하였는데 부분적으로 실패하는 부분이 있다면, 전부 실패하도록 구현되어 있습니다.

 


Consistency(일관성)

일관성(Consistency)은 데이터베이스의 상태가 일관되어야 한다는 성질입니다.

즉, 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효하여야 합니다.

다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족하여야 한다는 뜻입니다.

 

예를 들어 설명한다면, '모든 고객은 반드시 이름을 가지고 있어야 한다'는 제약이 있는 데이터베이스를 가정해 봅시다.

아래와 같은 트랜잭션은 일관성을 위반합니다.

  • 이름 없는 새로운 고객을 추가하는 쿼리
  • 기존 고객의 이름을 삭제하는 쿼리

위 예시는 '이름이 있어야 한다'는 제약을 위반합니다. 따라서 예시 트랜잭션이 일어난 이후의 데이터베이스는 일관되지 않는 상태를 가지게 됩니다.

데이터베이스의 유효한 상태는 다를 수 있지만, 데이터의 상태에 대한 일관성은 변하지 않아야 합니다.

 


Isolation(격리성, 고립성)

격리성(Isolation)은 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 뜻입니다.

실제로 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜잭션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 나타냅니다.

 

예를 들어 설명해 보겠습니다.

위의 예제는 격리성이 보장되지 않은 상태를 보여줍니다.

DB를 사용할 때 여러 Client가 접속하는데 이때 동시성 문제(경쟁 조건)에 직면할 수 있습니다.

위와 같은 상황을 방지하기 위해 격리성이 필요하게 됩니다.

Isolation을 하는 방법에는 Read Uncommitted, Read Commited, Repeatable Read, Serializable이 있습니다.

  • Read Uncommitted: commit 되지 않은 중간 데이터도 읽게 함 -> Dirty update 문제 발생
  • Read committed: Commit 된 데이터만 읽게 함 -> Dirty upate 문제 발생
  • Repeatable Read: 동시 수행되는 Transaction들에게 일련번호를 부여하고 자기 일련번호에 해당하는 commit 된 데이터만을 읽게 함 -> Phantom Read 문제 발생 가능성이 있음
  • Serializable: 트랜잭션을 순서대로 수행. 성능이 저하되어 특수한 경우에만 쓰임

위의 대한 자세한 내용은 시간이 된다면 다시 한번 자세히 다뤄보도록 하겠습니다.. ㅎ;;

 


Durability(지속성)

지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 하는 성질을 말합니다.

만약 런타임 오류나 시스템 오류가 발생하더라도 저장되며, 수동으로 지우지 않는 한 해당 기록은 영구적이어야 한다는 뜻입니다.

 


Reference

[데이터베이스] 트랜잭션의 ACID 성질

'데이터베이스' 카테고리의 다른 글

[데이터베이스] SQL vs NoSQL  (0) 2023.03.23