DEV ℧ Developer Diary

[DB] 트랜잭션 (Transaction)

트랜잭션 (Transaction)

요즘 재고의 동시성 이슈(Race Condition)에 관하여 공부중인데, 이중에 나온 트랜잭션의 공부가 추가로 필요할 것 같아 공부후에 기록하고자 정리를 하였다.

트랜잭션이란?

데이터베이스를 사용하는 이유는 데이터를 저장하는 것에 이유도 있겠지만, 트랜잭션이라는 개념이 있기 때문이다.

트랜잭션의 개념을 간단하게 설명하자면 데이터베이스의 상태를 변경시키기 위한 작업 수행의 가장 작은 논리적 단위를 의미한다.

데이터베이스는 트랜잭션을 사용함으로써 데이터에 신뢰성을 가질 수 있다.

간단하게 예시를 들어보자.

A가 B에게 금전거래를 통해 10,000원을 송금한다고 하자. 해당 작업을 가장 작은 단계로 풀이한다면 다음과 같다.

  1. A의 잔고가 10,000원 감소
  2. B의 잔고가 10,000원 증가

만약 1.의 단계를 완료한 이후 2.의 단계를 진행하던 도중 에러가 발생한다면 어떻게 되겠는가?

불쌍하게도 A의 잔고만 10,000원 감소가 되는 상황이 일어날것이다.

여기서 트랜잭션의 개념을 사용하게 된다면, 1.의 행위와 2.의 행위가 모두 성공해야 데이터가 반영되고, 중간에 하나라도 실패할 경우 아예 거래전의 상태로 돌아가도록 한다.

결과적으로는 모두 성공하거나 실패하여 거래에 심각한 오류가 초래하지 않도록 방지할 것이다.

트랜잭션에서는 성공하여 데이터가 반영될 경우 커밋(Commit)이라고 하며, 실패하여 되돌아가는 경우는 롤백(Rollback)이라고 한다.

트랜잭션의 특징 (ACID)

트랜잭션은 ACID라는 4가지의 특징을 가지고 있다.

A : 원자성 (Atomicity)

원자성은 데이터베이스 트랜잭션의 성공 또는 실패를 의미한다. 트랜잭션은 무조건 모든 프로세스가 성공하거나 또는 실패하여 되돌리거나 둘중 하나여야 한다.

예를 들어, 위에서 예시로 들었던 자금이체가 돈을 빼서 상대방의 돈을 증가 시키는 단계에서 한쪽만 실패를 하게되면 안된다. 원자성은 이러한 일이 없도록 하나만 실패하는 일이 없도록 하는것을 말한다.

C : 일관성 (Consistency)

일관성은 트랜잭션이 성공적으로 완료 된 이후 데이터베이스는 언제나 일관성 있는 상태로 유지하는 것을 말한다.

예를 들어, 무결성 제약이 금전거래는 잔고가 있는 계좌만 가능하다고 가정한다면 잔고가 없는 계좌들에 대한 거래의 트랜잭션은 일관성을 위반하게 된다.

I : 독립성 (Isolation)

독립성은 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 것을 말한다. 또한 동시에 많은 트랜잭션이 동시에 처리될때, 트랜잭션이 순차적으로 처리되어 하나의 동작을 하는것처럼 작동하는 것을 말한다.

예를 들어, 상품의 재고가 하나 남은 경우 두명이 해당 재고를 동시에 구매요청을 했다고 가정하자. 이 과정에서 트랜잭션을 순차적으로 처리하기 때문에 한명이 구매를 완료하면 재고는 0개가 되어 다른 한명은 구매가 실패를 하게 된다.

D : 지속성 (Durability)

지속성은 성공적으로 트랜잭션이 수행될 경우 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다.

예를 들어, A가 B에게 송금이 완료되어 관련된 트랜잭션이 성공적으로 수행되었을 경우 이후 시스템이 에러가 생겨 다운되어도 A가 B에게 송금한 내역은 반영되어 있으며, 로그로 남아있어야 하는것을 의미한다.