[DB] ACID 개념 정리

프로그래밍/서버2020. 9. 22. 18:34

en.wikipedia.org/wiki/ACID

위 내용과 구글 번역을 개선해서 ㅎㅎ 이해가 좀 쉽도록? 정리해보겠습니다.

 

기본 개념

컴퓨터 과학에서 ACID (atomicity, consistency, isolation, durability)는 오류, 정전 및 기타 사고에도 불구하고 데이터 유효성을 보장하기위한 데이터베이스 트랜잭션의 속성입니다. 데이터베이스에서 ACID 속성 (데이터에 대한 단일 논리 작업으로 인식 될 수 있음)을 충족하는 일련의 데이터베이스 작업을 트랜잭션이라고합니다. 예를 들어 한 은행 계좌에서 다른 계좌로 자금을 이체하는 것은 하나의 계좌에서 인출하고 다른 계좌에 입금하는 것과 같은 여러 변경(명령문)을 포함하는 경우에도 단일 트랜잭션입니다.

 

*조금 다르게 보면 특별한 경우 db 명령문 여러 개를 묶어 transaction으로 만들어 처리한다고 볼 수 있습니다.

 

1. Atomicity(원자성)

트랜잭션은 종종 여러 구문(statement)으로 구성됩니다. Atomicity는 각 트랜잭션이 완전히 성공하거나 완전히 실패하는 단일 "단위"로 처리되도록 보장합니다. 트랜잭션을 구성하는 명령문 중 하나라도 완료되지 않으면 전체 트랜잭션이 실패하고 데이터베이스는 변경되지 않은 상태로 유지됩니다. Atomic 시스템은 정전, 오류 및 충돌을 포함한 모든 상황에서 원자성을 보장해야합니다. 원자성 보장은 전체 시리즈(명령문)를 완전히 거부하는 것보다 더 큰 문제를 일으킬 수있는 데이터베이스 업데이트가 부분적으로만 이루어지는 것을 방지합니다. 결과적으로 트랜잭션이 다른 데이터베이스 클라이언트에서 진행되고 있는지 알 수 없습니다. 어느 순간에는 트랜잭션이 아직 발생하지 않았을 수 있고 다른 순간에는 이미 트랜잭션을 구성하는 명령문 전체가 실행됐을 것입니다 (또는 진행중인 트랜잭션이 취소 된 경우 아무 일도 발생하지 않음). 

원자적 트랜잭션의 예는 은행 계좌 A에서 계정 B 로의 통화 이체입니다. 이는 두 가지 작업으로 구성됩니다. 즉, A 계정에서 돈을 인출하고 계정 B에 저장합니다. 원자적 트랜잭션에서 이러한 작업을 수행하면 데이터베이스가 즉, 두 작업 중 하나가 실패해도 돈이 손실되거나 생성되지 않습니다.

 

*Atomicity는 제일 이해하기 쉬운 개념입니다.

 

2. Consistency(일관성)

일관성은 트랜잭션이 하나의 유효한 상태에서 다른 상태로만 데이터베이스를 가져와 데이터베이스 불변을 유지하도록 보장합니다. 데이터베이스에 기록된 모든 데이터는 제약 조건, 캐스케이드, 트리거 및 이들의 조합을 포함하여 정의된 모든 규칙에 따라 유효해야합니다. 이는 불법 트랜잭션으로 인한 데이터베이스 손상을 방지하지만 트랜잭션이 정확하다는 것을 보장하지는 않습니다. 참조 무결성(Referential integrity)은 primary key-foreign key 관계를 보장합니다. 

 

*primary key: 한 table에서 PRIMARY KEY로 정의됨

*foreign key: 다른 테이블에서 FOREIGN KEY로 정의된 primary key(join을 위해 쓰이겠죠?)

*분산 서버에서 말하는 Consistent를 말하는 줄 알았는데 아니네요. ACID에서 consistency는 그냥 생성한 table에서 제약을 둔 데이터 규칙을 만족시키는 것을 의미합니다. 

 

CREATE TABLE acidtest (A INTEGER, B INTEGER, CHECK (A + B = 100));

 

위의 코드는 acidtest 테이블을 생성하는데 A와 B의 값이 100이어야만 한다는 조건(integrity constraint)을 명시하고 있습니다. A는 50, B는 50인 상태에서 A의 값만 40으로 변경하는 경우 A+B는 100이 되지 않으므로 consistency를 보장하기 위해 전체 트랜잭션이 취소된다고 합니다.

 

3. Isolation(격리)

트랜잭션들은 종종 동시에 실행됩니다 (예 : 동시에 테이블을 읽고 쓰는 여러 트랜잭션). 격리는 트랜잭션의 동시 실행이 트랜잭션이 순차적으로 실행 된 경우 얻은 것과 동일한 상태로 데이터베이스를 유지하도록합니다. 격리는 동시성 제어(concurrency control)의 주요 목표입니다. 사용된 방법에 따라 불완전한 트랜잭션의 영향이 다른 트랜잭션에 표시되지 않을 수도 있습니다.

 

*여러 명령어로 이루어진 2개의 트랙잭션이 동일한 값에 접근해 read/write하는 경우를 생각해봐야 합니다.

T1 = 트랜잭션1

T2 = 트랙잭션2

A의 시작값은 60

B의 시작값은 40으로 가정

 

1. T1 subtracts 10 from A.  -> A의 값은 50이 됨
2. T2 subtracts 20 from B.  -> B의 값은 20이 됨
3. T2 adds 20 to A.  -> A의 값은 70이 됨
4. T1 adds 10 to B. -> B의 값은 30이 되어야 하나 이 단계에서 실패한다고 가정함

 

만약 트랜잭션 T1이 T2작업이 끝난 뒤의 4번 단계에서 실패를 한다면.. 트랜잭션T1은 전체 명령문을 취소해야 합니다. 1번 단계에서 T1의 작업이 실행되기 전에 A의 값은 60이었습니다. 하지만 T1이 실패했다고 해서 단순히 A의 값을 60으로 복구하면 이는 isolation을 위반하게 되며 우리가 원하는 결과도 아닙니다. 우리가 원하는 값은 70이며 이를 만족시키는 것은 Isolation이라고 합니다.

 

4. Durability(내구성)

내구성은 트랜잭션이 커밋(commit)된 후 시스템 오류 (예 : 정전 또는 충돌)의 경우에도 커밋 된 상태로 유지되도록 보장합니다. 이것은 일반적으로 완료된 트랜잭션 (또는 그 효과)이 비 휘발성 메모리에 기록됨을 의미합니다.

 

*Durability도 이해하기 쉬운 내용 같습니다. 트랜잭션의 결과가 HDD나 SSD같은 비휘발성 메모리에 기록되어 정전 등의 상황에서도 데이터가 유지된다는 내용입니다.

 

 

참고

대박 잘 정리된 글(이 글을 봐주세요!): suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/

작성자

Posted by 드리머즈

관련 글

댓글 영역