db - ACID

DB/Common 2013.06.22 12:21


ACID(원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계를 트랜잭션이라고 한다. 예를 들어, 은행에서의 계좌이체를 트랜잭션이라고 할 수 있는데, 계좌이체 자체의 구현은 내부적으로 여러 단계로 이루어질 수 있지만 전체적으로는 '송신자 계좌의 금액 감소', '수신자 계좌의 금액 증가'가 한 동작으로 이루어져야 하는 것을 의미한다.

  • 원자성(Atomicity)은 트랜잭션과 관련된 작업들이 모두 수행되었는지 아니면 모두 실행이 안되었는지를 보장하는 능력이다. 자금 이체는 성공할 수도 실패할 수도 있지만 원자성은 중간 단계까지 실행되고 실패하는 일은 없도록 하는 것이다.
  • 일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
  • 고립성(Isolation)은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다. 성능관련 이유로 인해 이 특성은 가장 유연성 있는 제약 조건이다. 자세한 내용은 관련 문서를 참조해야 한다.
  • 지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다. 전형적으로 모드 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.

구현[편집]

ACID속성을 구현하는 건 간단한 문제가 아니다. 트랜잭션 처리는 인덱스 업데이트를 비롯한 수많은 변화가 필요하다.

연산 순서는 실패의 원인이 되기도 한다. 예를 들면 공간부족이나 CPU 자원 점유문제가 있다.

ACID는 DB의 모든 연산이 한번에 실행되는 것을 권장한다. 사실상 이것은 정렬하기 어려운 문제이다. 널리 사용하는 두 가지 방법이 있는데 로깅방식과 새도우 패이징이다. 두경우 모두 업데이트 되는 데이터(구현방식에 따라 읽혀지는 데이터)에 락(lock)을 거는 것이 필요하다. 로깅방식에서 원자성은 DB에 데이터를 업데이트 하기 전에 로그에 모든 변경사항을 기록하는 것으로 보장된다. 이것은 크래쉬 현상이 발생하더라도 DB 무결성을 보장해준다. 새도 패이징 방식은 변경이 DB의 복사본에 저장된다. 그리고 새로운 복사본은 트랜잭션이 commit 되면 활성화 된다. 복사본은 변경 전 데이터 부분만을 의미한다.

최근까지 DB들은 대부분 ACID를 보장하기 위해 락(lock)에 의존했다. 이것은 데이터 처리전에 언제나 락이 필요함을 의미한다. 많은 수의 락을 관리하게 되면 동시작업 수행이 어렵고 성능저하를 초래하게 된다. A유저가 특정 테이블을 읽고 있다면 B유저는 A의 트랜잭션이 끝나기를 기다려야 한다.

락의 대안으로 수정되는 모든 데이터를 별도 복사본으로 관리하는 MVCC(multiversion concurrency control)가 있다. 방금 전 언급한 A,B 유저의 예를 들면 A가 트랜잭션을 시작할 때 가지고 있던 복사본을 B에 제공하여 동시에 수행이 가능하다. 이 방식은 사용자들이 데이터 처리하는 데 있어 많은 유연성을 제공한다.

네트워크 환경에서 ACID특성을 보장하는 것은 어렵다. 연결이 끊길 수도 있고 두 사용자가 동시에 DB의 동일한 부분을 접근할 수도 있다

트랜잭션의 commit 여부를 각 사용자로부터 확인하기 위해 2단계 commit이 분산 트랜잭션에 적용된다. 트랜잭션이 병렬 수행되는 경우 많은 주의가 필요하다. 2단계 락은 완전한 독립성을 보장하기 위해 사용된다.






ACID 는 신뢰할 수있는 거래 시스템이 있어야 성질로서 1970 년대 후반에 짐 그레이 가 정의한 개념에서 더 이상 분해해서는 안된다는 의미의 자성 ( 영어 : atomicity , 불가분성 ) 일관 성 (영어 : consistency ), 독립성 ( 영어 : isolation ) 및 지속성 ( 영어 : durability )은 트랜잭션 처리 의 신뢰성을 보증하기 위해 요구되는 성질이라고하는 사고 방식이다 [1] .

이 말은 그 4 가지 성격을 나타내는 영어 단어의 머리 글자 를 취하고 만든 합성어 이며, 1983 년 안드레아스 로이터 [2] 와 테오 헬데르 [3] 에 의해 제창되었다.

목차

  [ 숨기기 ] 

개요 편집 ]

데이터베이스에서는 데이터에 대한 하나의 논리적 조작을 트랜잭션 이라고 부른다. ACID의 각 특성을 은행에서 계좌 간 송금을 예로 들어 설명한다.

자성 편집 ]

트랜잭션에 포함 된 모든 작업이 실행되거나 전혀 실행되지 않도록하는 성질을 말한다. 일본어로는 원 자성 또는 원자 성과도 불린다. 계좌 A에서 계좌 B에 대해 1 만엔 송금하는 경우를 생각했을 때, 송금 작업은 다음 두 작업에 의해 이루어진다.

  1. 계좌 A의 잔액에서 1 만엔을 끄는
  2. 계좌 B의 잔액에 1 만엔을 추가

자성이 보장되는 것은 위의 조작 1,2가 모두 수행되거나 전혀 수행되지 않는 것을 가리킨다. 한쪽 만 실행 된 경우 은행 전체의 예금 잔고 충돌이 발생 해 버린다.

일관성 편집 ]

일본어에서는 일관성 또는 무결성이라고도 불린다. 트랜잭션 시작 및 종료시에 미리 주어진 무결성을 충족 시킨다고 보장하는 성질을 말한다. 즉, 데이터베이스의 규칙, 즉 무결성 조건을 충족하지 않는 상태를 일으키는 트랜잭션은 실행이 중단된다.

예금 잔고를 예로하면, 그 값은 일반적으로 0 또는 양수 값을 가지고 조건을 충족 필요가있다. 따라서 계좌 A에서 송금 할 때, 그 전후에 A의 계좌 잔고가 마이너스가되는 금액은 송금하지 못하게한다. 이러한 규칙을 보장하는 것이 일관성 역할이다.

독립성 편집 ]

트랜잭션 동안 수행하게되는 작업 과정이 다른 작업에서 은폐되는 것을 말하며, 일본어로 분리, 독립성 또는 고립 성이라고도한다. 형식적으로는 독립성과 거래 내역이 직렬화 된 것으로 볼 수있다. 이 성질과 성능 트레이드 오프 의 관계에 있기 때문에 일반적으로이 성격의 일부를 완화하여 구현되는 경우가 많다.

예금 잔액의 예에서는 잔액 100 만엔의 계좌 A에서 잔액 200 만엔의 계좌 B에 1 만엔 송금 할 경우 작업이

  1. 계좌 A의 잔액에서 1 만엔을 끄는
  2. 계좌 B의 잔액에 1 만엔을 추가

의 순서로 이루어 졌다고한다. 취할 수있는 내부 상태는

시점계좌 A계좌 B
송금 전100 만엔200 만엔
실행 중99 만엔200 만엔
송금 후99 만엔201 만 원

세되지만, 외부에서 송금 전에 와 송금 후 중 하나의 상태만을 관측 할 수 없다.

지속성 편집 ]

지속성 또는 지속성했다. 트랜잭션 작업의 완료 통지를 사용자가받은 시점에서, 그 작업은 지속되고, 결과가 손실되지 않는다는 것을 가리킨다. 이것은 시스템 장애를 허용하는 것이며,DBMS 는 무결성 제약 조건 을 체크되어 있고 트랜잭션을 중단하지 말라는 ​​것이다. 많은 데이터베이스 구현은 트랜잭션 작업을 지속성 저장 장치 에 로그로 기록 시스템에 이상이 발생하면 로그를 사용하여 이상 발생 이전 상태로 복구하는 것으로 지속성을 실현하고있다.

구현 편집 ]

트랜잭션의 상태 변경, 예를 들어 데이터 자체뿐만 아니라 그에 따른 인덱스 의 업데이트처럼 여러 변화에 의해 구성되는 경우가 많아 복잡하다. 또한 엄격하게 ACID를 구현하려고하면 광범위한 잠금을 얻거나 많은 데이터를 복제하는 등의 성능면에서 열화가 너무 커지는 경우가있다. ACID를 엄격하게 구현하는 것은 어렵다.

또한 ACID를 실현하는 절차 자체가 시스템 요인에서 실패 해 버리는 경우도있어, 그 실패 요인을 해결 한 후 복구 할 수있는 조치를 취할 필요가있다. 예를 들어, UNIX 파일 구현에 대해 저널 파일 시스템 에서 파일의 일관성 보호, 데이터의 전체 백업 등의 대처 등 많은 개선과 처리의 궁리가 도입되고있다.

ACID는 데이터베이스가 모든 작업을 한번에 처리 할 것을 요구하고있다. 실제로이 처리手筈을 정돈하기 어렵다. 그러나 이렇게하는데 로그 선행 기입 ( 영어 : write ahead logging )와 그림자 페이징 의 두 가지 일반적인 기법이 존재한다. 두 경우 모두, 읽고 쓰기하는 모든 정보에 대해 잠금 을 가져 두지 않으면 안된다. 로그 선행 기입의 경우 데이터베이스에 실제 쓰기 작업을 수행하기 전에 모든 redo 재실행 와 undo ( 되돌리기 ) 의 정보가 기록되는 것으로, 원 자성 이 보장된다. 그림자 페이징의 경우 업데이트는 데이터베이스의 복사본을 만든 트랜잭션이 커밋 될 때 새 데이터베이스가 활성화된다. 이 복사본은 전체를 복사하는 것이 아니라 변경되지 않은 부분은 이전 버전의 데이터베이스에 대한 참조 형태로 진행된다.

여러 트랜잭션을 동시에 수행 할 때, 독립성의 실현에주의해야한다. 사실, 완전한 독립성의 실현은 높은 비용 때문에 실현 트랜잭션 격리 수준 을 설정하고 구현하게된다. 또한 격리 수준의 구현은 교착 상태와 라이브 락 등에주의하여 수행해야한다. 예를 들어 간 위상 잠금 등이 일반적으로 이용된다.

트랜잭션과 관련된 참가자가 여러 개인 경우, 예를 들면 투 단계 커밋 (2PC)이 일반적으로 이용된다. 투 단계 커밋에서는 각 참가자가 커밋에 동의 여부에 대해 일치하는 것을 보장한다.

트랜잭션을 고려한 파일 시스템 편집 ]

다른 모델 편집 ]

ACID는 대조적으로, 결과적 일관성 (BASE [4] )라는 일관성 모델 도 고안되어있다.

각주 편집 ]

  1. ISO / IEC 10026-1:1992 Section 4
  2. ^ Andreas Reuter
  3. ^ Theo Härder
  4. 영어 : basically available, soft state




출처 - http://ko.wikipedia.org/wiki/ACID





'DB > Common' 카테고리의 다른 글

search - Elasticsearch  (0) 2014.04.24
db - jdbc vs jpa  (0) 2013.09.14
db - ACID  (0) 2013.06.22
Sharding & Query Off Loading  (0) 2013.04.29
SELECT문 순서와 처리순서  (0) 2012.08.29
데이터 입력과 db insert 사이에 버퍼링 방법  (0) 2012.07.13
Posted by linuxism