Transaction의 ACID

hjkim·2022년 6월 15일
2
post-custom-banner

Transaction

트랜잭션이란, 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 논리적 단위이다. 데이터베이스로 들어온 질의(query)를 하나의 묶음 처리하여 중간에 실행이 되면 rollback을 수행하고 오류 없이 실행을 마치면 commit을 수행한다.

DBMS의 성능은 초당 실행되는 트랜잭션의 수(TPS)로 측정되곤 한다.

Transaction ACID

ACID란 transaction이 처리 과정에서 갖는 4가지 특징을 약어로 나타낸 것이다.

1. 원자성(Atomicity)

데이터에 행해질 여러 작업들이 하나의 작업처럼 작동한다는 특징을 일컫는다. 즉, 여러 작업들을 전부 처리하거나 단 하나도 처리하지 않는다. A의 계좌에서 B의 계좌로 100만원을 송금하는 경우 A의 계좌 금액은 -100만원, B의 계좌 금액은 +100만원으로 업데이트 되어야 한다.

  1. A의 금액만 -100만원으로 업데이트 되고 B의 금액이 그대로인 경우
  2. B의 금액만 +100만원으로 업데이트 되고 A의 금액이 그대로인 경우

위의 두 경우는 원자성을 보장하지 않는다. transaction 처리는 원자성이라는 특징을 갖기에 위의 두 경우가 발생했을 때 A와 B의 계좌 금액을 100만원을 송금하기 이전으로 되돌린다.

A의 계좌 금액을 -100만원으로 업데이트 하는 작업과 B의 계좌 금액을 +100만원으로 업데이트 하는 작업을 하나의 작업처럼 처리하여 두 작업이 전부 완료되지 않는 경우에는 그 이전 상태로 전부 되돌리는 것이다. 이것을 All or Nothing이라고 표현한다.

2. 일관성(Consistency)

transaction이 시작되었을 때와 종료되었을 때 데이터가 일관성을 유지한다는 특징을 일컫는다.
A가 B에게 100만원을 송금하는 예제를 다시 한 번 살펴본다. A가 가진 금액이 200만원이고 B가 가진 금액이 100만원이었다고 가정한다.

  1. A 송금 전 : 200(A의 잔액) + 100(B의 잔액), 300만원의 총액
  2. A 송금 후 : 100(A의 잔액) + 200(B의 잔액), 300만원의 총액

위와 같이 A가 송금하는 transaction의 전후로 A의 잔액과 B의 잔액의 합이 300만원으로 일관성을 갖는다. A가 송금하는 도중 100만원이 공중으로 분해되어 총 잔액이 300만원에서 200만원으로 줄어드는 일이 발생하지 않고 데이터가 일관성 있게 유지된다.

다른 예로는, column을 업데이트 하는 transaction이 있다. USER 테이블의 NAME 컬럼을 수정하려고 한다.

  1. 수정 전 : NAME = 'hjkim', String 타입
  2. 수정 후 : NAME = 'devhjkim', String 타입

USER 테이블의 NAME 컬럼은 String이다. NAME 컬럼을 수정하는 transaction 시작 시점과 종료 시점에서 모두 String의 값을 갖는다. NAME 컬럼을 수정하는 transaction이 발생하고 NAME 컬럼의 데이터가 'hjkim'에서 Integer인 100으로 변했다면 해당 transaction은 일관성을 유지하지 못하고 있는 것이다.

3. 격리성(Isolation)

transaction을 수행하고 있는 도중에 다른 transaction이 접근, 방해할 수 없다는 특징을 일컫는다. 각 transaction을 유일한 transaction인 것처럼 격리시켜주어 동시에 DB로 들어온 transaction 작업이 순차적으로 처리되는 것처럼 보이게 된다.

transaction이 방해받지 않는 가장 좋은 방법은 동시에 들어온 transaction을 하나씩 하나씩 처리하는 방법이다. 따라서 격리성이 높아질수록 동시에 접근한 transaction 작업이 동시에 처리되지 못하여 성능 손해가 발생할 수 있다.

RDBMS에서는 이러한 성능 손해를 막고자 격리 수준(isolation level)에 차등을 둔 여러 Transaction Model을 제공하고 있다. 개발자는 프로젝트의 성격에 맞는 Transaction Model을 사용해 DB에 적용할 수 있다. 해당 포스트는 이전에 업로드하였던 글을 참조하면 더 자세히 알 수 있다.

Transaction Model

4. 지속성(Durability)

transaction이 성공적으로 종료되면 변경된 데이터를 지속시키는 특징을 일컫는다. 다음 transaction이 해당 데이터를 변경시키지 않는 이상 데이터는 영구히 보존된다. 성공적으로 commit 된 데이터는 DB가 죽더라도 재접속 했을 때 보존되어 있어야 한다.


[참조] https://victorydntmd.tistory.com/129
[참조] https://blog.yevgnenll.me/posts/what-is-acid-about-transaction
[참조] https://www.ibm.com/docs/en/cics-ts/5.4?topic=processing-acid-properties-transactions

profile
피드백은 언제나 환영입니다! :)
post-custom-banner

0개의 댓글