[SQL] ACID 개념 학습

Yalstrax·2021년 7월 25일
1

Back End

목록 보기
21/22
post-thumbnail

ACID

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

트랜잭션(Transaction)

트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛입니다. 각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료합니다.

만약 하나의 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업이라도 실패하면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단합니다.

다시 말해 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고, 모든 작업이 성공적이면 트랜잭션 또한 성공입니다.

즉, 트랜잭션은 성공 또는 실패 라는 두 개의 결과만 존재합니다.

계좌이체를 예를 들면, A에게 10만원을 보내면 나의 계좌에서 10만원을 빼고, A의 계좌에 10만원을 추가하는 종합적인 과정이 트랜잭션입니다.

만약, 나의 계좌에서 10만원이 빠졌는데, A의 계좌에 10만원이 추가되지 않는다면, 그 10만원은 세상에서 사라집니다.

즉, 계좌이체라는 트랜잭션이 발생할 때, 그 안정성을 보장할 수 있는 성질이 ACID입니다.

ACID는 각 4 단어의 약자를 합친 단어입니다.

Atomicity (원자성)

원자성은 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 합니다.

계좌 이체를 예로, 출금은 성공했는데, 입금이 실패한다면 이 전체 과정을 실패로 돌려야 돈이 사라지지 않게 됩니다.

Consistency (일관성)

데이터베이스의 상태가 일관되어야 한다는 성질입니다. 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 합니다.

은행에서 계좌를 만들 때, 계좌의 이름 없이 계좌를 생성할 수 없습니다. 만일, 데이터베이스에 이름이 없는 계좌가 추가될 때, 이 일관성으로 인해 트랜잭션은 실패로 돌아갑니다.

Isolation (격리성, 고립성)

모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다 는 성질입니다.

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

예를 들어 게좌에 만 원이 있다고 가정하겠습니다.

이 계좌로부터 계좌 B로 6천 원을, 계좌 C로 6천 원을 동시에 계좌 이체하는 경우, 계좌 B에 먼저 송금한 뒤 계좌 C에 보내는 결과와 동일해야 합니다.

동시에 트랜잭션을 실행한다고 해서 계좌 B와 C에 각각 6천 원씩 송금하여 마이너스 통장이 되는 것이 아닙니다. 각각의 송금 작업을 연속으로 실행하는 것 (B에게 송금을 하고난 후, C에게 송금) 과 동일한 결과가 나타나야 합니다.

Durability (지속성)

성공한 트랜잭션에 대한 로그는 기록되고 영구적으로 남아야합니다.

런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 합니다.

A가 B로 입금을 성공했습니다. 그러나 은행 서버 에러로 처리가 되지 않은 경우, 입금 내역은 이미 성공했다는 기록이 데이터베이스에 남아있습니다.

만약, 이체하는 중에 서버 에러가 발생하여 트랜잭션이 실패한다면, 기록이 남지 않습니다. 그래서, 이체 요청 이전 상태로 돌아가게 됩니다.

ACID는 전자 상거래 서비스에서 필수적으로 적용되어야 할 성질입니다.

profile
즐겁다면 그것만으로 만만세!

0개의 댓글