[DB] 트랜젝션(Transaction)과 ACID 특성

kai6666·2022년 6월 12일
0

TIL.DB

목록 보기
2/3

💁‍♀️ 트랜젝션 (Transaction)

일반적으로 금융 거래를 트랜젝션이라고 부른다. 그러나 데이터베이스에서 트랜젝션은 다른 의미를 가진다.

트렌젝션이란, 여러 작업을 하나로 묶은 실행 단위이다. 예를 들어 계좌 이체의 트렌젝션은 간단하게 나누면 2개의 작업이다. 출금과 입금이다. 유저 입장에서는 이체라는 한 가지 행위이지만, 이것은 데이터베이스에서 출금과 입금이라는 두 가지 작업으로 이루어진 트랜젝션이다.

그런데 입금과 출금 둘 중 하나라도 실패하면, 유저의 돈이 휘발된다. 따라서 데이터베이스에서 트랜젝션은 모든 작업이 성공할 때 성공하고, 하나라도 실패하면 전부 실패인 ALL OR NOTHING 개념으로 이해해야 한다.

✨ ACID


ACID는 트랜젝션의 안전성을 보장하기 위해 필요한 성질이다.

Atomicity(원자성)

하나의 트랜젝션에 속한 모든 작업이 전부 성공하거나 전부 실패해야 원자성이 지켜진다. 하나의 작업이 실패할 때, 모든 작업을 실패하게 만들어야 기존 데이터를 보호할 수 있다. 트랜잭션을 설명하며 예시로 든 계좌 이체의 경우가 원자성을 설명하는 대표적인 예시이다.

Consistency(일관성)

트랜잭션 전후로 데이터베이스의 상태가 이전과 똑같이 유효해야 한다. 이 말은 트랜잭션 이후로 데이터베이스가 기존 데이터베이스의 제약이나 규칙을 만족해야 한다는 의미이다.

예를 들어 '모든 고객은 반드시 전화 번호를 가지고 있어야 한다'는 데이터베이스의 제약이 있다고 했을 때, 전화 번호를 입력하지 않은 고객을 가입시키는 쿼리나 기존 전화 번호를 삭제하고 새로 입력하지 않게 하는 쿼리는 일관성에 위반된다. (제약은 데이터베이스마다 다를 수 있다.)

Isolation(격리성)

모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다. 동시에 여러 개의 트랜잭션을 실행할 때, 각 트랜잭션은 서로로부터 격리되어 연속으로 실행된 것과 같은 결과를 나타내야 한다.

예를 들어 계좌 A로부터 계좌 B로 200원을, 계좌 C로 1000원을 동시에 이체하는 경우, 두 계좌에 순차적으로 보낸 것과 트랜잭션의 결과가 동일해야 한다. 격리된 두 트랜젝션은 서로 방해하거나 영향을 미치지 않는다.

Durability(지속성)

하나의 트랜잭션이 성공적으로 수행됐다면, 해당 트랜잭션에 대한 로그가 남아야 한다. 시스템에 오류가 발생해도, 트랜젝션 기록은 영구적이어야 한다. 계좌 이체 후에 은행 데이터베이스에 오류가 나도 이체한 내역은 남아야 한다. 마찬가지로 이체를 로그로 기록하기 전에 시스템에 오류가 난다면, 이체를 실패한 것으로 처리하고 계좌는 이체 이전의 상태로 돌아가야 한다.

profile
성장 아카이브

0개의 댓글