산성의

ACID

컴퓨터 과학에서 ACID(원자성, 일관성, 격리, 내구성)는 오류, 정전 및 기타 [1]장애에도 불구하고 데이터 유효성을 보장하기 위한 데이터베이스 트랜잭션의 속성 세트입니다.데이터베이스의 맥락에서 ACID 속성을 충족하는 일련의 데이터베이스 작업을 트랜잭션이라고 합니다(데이터에 대한 단일 논리적 작업으로 인식될 수 있음).예를 들어, 한 계좌에서 다른 계좌로 자금을 이체하는 것은 한 계좌에서 다른 계좌로 이체하는 것과 같은 여러 가지 변경을 수반하는 경우에도 단일 거래입니다.

1983년 [2]Andreas Reuter와 Theo Hérder거래 개념을 특징 지을 때 원자성, 일관성 및 내구성을 단절이 아니라 이름 붙인 Jim[3] Gray의 이전 연구를 바탕으로 ACID라는 약어를 만들었습니다.이 네 가지 특성은 트랜잭션 패러다임의 주요 보증 사항이며, 이는 데이터베이스 시스템의 많은 개발 측면에 영향을 미쳤다.

Gray와 Reuter에 따르면 IBM Information Management System은 1973년에 ACID 트랜잭션을 지원했습니다(단,[4] 약어는 나중에 생성되었지만).

특성.

Reuter와 Hérder에 의해 정의된 이들 4가지 특성의 특징은 다음과 같다.

원자성

트랜잭션은 종종 여러 의 문장으로 구성됩니다.원자성은 각 트랜잭션을 하나의 "단위"로 취급하는 것을 보증합니다.이것은 완전히 성공하거나 완전히 실패합니다.트랜잭션을 구성하는 스테이트먼트 중 하나가 완료되지 않으면 트랜잭션 전체가 실패하고 데이터베이스는 변경되지 않습니다.원자 시스템은 정전, 오류 및 크래시를 [5]포함한 모든 상황에서 원자성을 보장해야 합니다.원자성을 보증하면 데이터베이스에 대한 업데이트가 부분적으로만 발생하는 것을 방지할 수 있으며, 이로 인해 시리즈 전체를 완전히 거부하는 것보다 더 큰 문제가 발생할 수 있습니다.따라서 다른 데이터베이스 클라이언트에서 트랜잭션이 진행 중인 것을 확인할 수 없습니다.한때는 아직 발생하지 않았고, 다음 시점에서는 이미 전체적으로 발생한 경우(또는 트랜잭션이 취소된 경우 아무 일도 일어나지 않은 경우)입니다.

원자성 거래의 예로는 은행 계좌 A에서 계좌 B로의 금전 이체가 있다.계좌 A에서 돈을 인출하고 계좌 B로 저축하는 두 가지 작업으로 구성됩니다.원자 거래에서 이러한 작업을 수행하는 것은 데이터베이스가 일관된 상태로 유지되도록 보장합니다. 즉, 이 두 작업 중 하나가 [6]실패해도 돈은 인출되거나 신용되지 않습니다.

일관성(정확성)

일관성을 통해 트랜잭션은 데이터베이스 불변성을 유지하면서 하나의 유효한 상태에서 다른 상태로 데이터베이스만 전환할 수 있습니다. 데이터베이스에 기록된 데이터는 제약조건, 캐스케이드, 트리거 및 이들의 조합을 포함하여 정의된 모든 규칙에 따라 유효해야 합니다.이렇게 하면 불법 트랜잭션에 의한 데이터베이스 손상을 방지할 수 있지만 트랜잭션이 올바르다는 보장은 없습니다.참조 무결성은 기본 키, 즉 외부[7]관계를 보장합니다.

격리

트랜잭션은 종종 동시에 실행됩니다(예: 여러 트랜잭션을 동시에 읽고 테이블에 쓰는 것).분리를 통해 트랜잭션을 동시에 실행하면 트랜잭션이 순차적으로 실행되었을 때와 동일한 상태로 데이터베이스를 유지할 수 있습니다.분리는 동시성 제어의 주요 목표입니다.사용하는 방법에 따라서는 불완전한 트랜잭션의 영향이 다른 [8]트랜잭션에서도 보이지 않을 수 있습니다.

내구성

내구성 덕분에 트랜잭션은 일단 커밋된 상태로 유지되며, 시스템 장애(예: 정전 또는 충돌)가 발생한 경우에도 커밋된 상태로 유지됩니다.이는 보통 완료된 트랜잭션(또는 그 영향)이 비휘발성 [citation needed]메모리에 기록됨을 의미합니다.

다음 예에서는 ACID 속성을 자세히 보여 줍니다.이러한 예에서 데이터베이스 테이블에는 A와 B라는 두 개의 열이 있습니다.무결성 제약 조건에서는 A의 값과 B의 값을 합해야 합니다.다음 SQL 코드는 위에서 설명한 대로 테이블을 만듭니다.

만들다 테이블 산성 시험 (A 정수, B 정수, 확인. (A + B = 100)); 

원자성

원자성은 원자성 트랜잭션의 일련의 데이터베이스 조작이 모두 발생하거나(성공한 조작), 또는 아무것도 발생하지 않음을 보증합니다(성공하지 않은 조작).일부 작업만 실행한 상태에서 일련의 작업을 분리할 수 없기 때문에 일련의 작업은 "분할 수 없는" 상태가 됩니다.원자성을 보증하면 데이터베이스에 대한 업데이트가 부분적으로만 발생하는 것을 방지할 수 있으며, 이로 인해 시리즈 전체를 완전히 거부하는 것보다 더 큰 문제가 발생할 수 있습니다.다른 말로 원자성은 불가분성과 환원불능을 [9]의미한다.또는 논리적 트랜잭션은 여러 물리적 트랜잭션으로 구성될 수 있습니다.모든 컴포넌트의 물리 트랜잭션이 실행되지 않는 한 논리 트랜잭션은 발생하지 않습니다.논리적 거래가 은행 계좌 A에서 은행 계좌 B로 자금을 이체하는 것으로 구성될 수 있습니다. 즉, 먼저 계좌 A에서 금액을 제거한 후 계좌 B에 동일한 금액을 예치하는 것입니다.A계정에서도 B계정으로 이체된 것을 확인할 때까지는 A계정에서 이체된 금액을 보고 싶지 않습니다.그 후 두 거래가 모두 이루어지고 금액이 계좌 B로 이체될 때까지 논리적인 이체는 발생하지 않습니다.

일관성 장애

일관성은 데이터가 모든 검증 규칙을 충족해야 하는 매우 일반적인 용어입니다.위의 예에서 검증은 + = 100의 요건입니다.일관성을 유지하려면 모든 검증 규칙을 확인해야 합니다.트랜잭션이 10을 빼려고 시도한다고 가정합니다.A변하지 않고B. 거래 후 일관성이 확인되므로 거래 시작 전 + = 100으로 알려져 있습니다.트랜잭션이 10을 제거했을 경우A성공적으로 원자성이 달성될 것입니다.그러나 유효성 검사에서는 + = 90으로 나타나며 이는 데이터베이스 규칙과 일치하지 않습니다.전체 트랜잭션을 취소하고 영향을 받는 행을 트랜잭션 이전 상태로 롤백해야 합니다.다른 제약, 트리거 또는 캐스케이드가 있는 경우 트랜잭션이 커밋되기 전에 위와 같은 방법으로 모든 변경 조작이 체크됩니다.다른 제약 조건에서도 유사한 문제가 발생할 수 있습니다.양쪽의 데이터 타입이 필요했을 가능성이 있습니다.A그리고.B정수입니다.예를 들어 13.5의 값을 입력하면A트랜잭션이 취소되거나 시스템이 트리거 형식으로 경보를 발생시킬 수 있습니다(트리거가 이 취지의 내용을 기록한 경우/쓰기된 경우).또 다른 예로는 무결성 제약이 있습니다.이는 다른 테이블의 적어도1개의 외부 키에 의해 프라이머리 키가 참조되는 테이블 내의 행을 삭제할 수 없습니다.

분리 실패

분리를 설명하기 위해 2개의 트랜잭션이 동시에 실행되며 각각 동일한 데이터를 수정하려고 한다고 가정합니다.둘 중 하나는 분리를 유지하기 위해 다른 하나가 완료될 때까지 기다려야 합니다.

다음 두 가지 트랜잭션을 고려합니다.

  • T는1 10을 A에서 B로 옮긴다.
  • T는2 20을 B에서 A로 옮긴다.

조합된 4가지 액션이 있습니다.

  1. T는1 A에서 10을 뺀다.
  2. T는1 B에 10을 더한다.
  3. T는2 B에서 20을 뺀다.
  4. T는2 A에 20을 더한다.

이러한 조작이 순서대로 실행되면 T는 대기해야 하지만2 격리는 유지됩니다.T가 도중에 실패하면 어떻게1 되는지 생각해 보십시오.데이터베이스는 T의 효과를 제거하며12 T는 유효한 데이터만 봅니다.

트랜잭션을 인터리빙하면 실제 작업 순서는 다음과 같습니다.

  1. T는1 A에서 10을 뺀다.
  2. T는2 B에서 20을 뺀다.
  3. T는2 A에 20을 더한다.
  4. T는1 B에 10을 더한다.

다시 스텝 4에서 B를 변경할 때 T가 실패하면 어떻게1 되는지 생각해 보겠습니다.T가 실패했을 때1 T는2 이미 A를 수정했습니다.비활성 데이터베이스를 남기지 않고는 T 이전의1 값으로 복원할 수 없습니다.이는 두 트랜잭션이 동일한 데이터 필드에 쓰기를 시도했기 때문에 쓰기-쓰기 [citation needed]충돌이라고 합니다.일반적인 시스템에서는 마지막으로 확인된 정상 상태로 되돌리고 실패한 트랜잭션1 T를 취소한 후2 중단된 트랜잭션 T를 정상 상태에서 재시작하면 문제가 해결됩니다.

내구성 장애

A에서 B로 10을 이전하는 거래를 생각해 보세요.먼저 A에서 10을 제거한 다음 B에 10을 추가합니다.이 시점에서, 유저는 그 트랜잭션이 성공했다고 통지됩니다.그러나 변경 내용은 여전히 Disk 버퍼에 대기하여 Disk에 커밋됩니다.정전이 되어 변경은 없어지지만, 유저는 변경이 계속 되는 것을 상정하고 있습니다(이해할 수 있습니다).

실행

트랜잭션을 처리하려면 여러 가지 이유로 실패할 수 있는 일련의 작업이 필요한 경우가 많습니다.예를 들어, 시스템의 디스크 드라이브에 빈 공간이 없거나 할당된 CPU 시간을 모두 사용했을 수 있습니다.일반적인 기술 패밀리는 쓰기 전 로깅과 섀도 페이징 두 가지가 있습니다.두 경우 모두 업데이트할 모든 정보에 대해 잠금을 획득해야 하며, 격리 수준에 따라서는 읽을 수 있는 모든 데이터에 대해서도 잠금을 획득해야 합니다.라이트 어헤드 로깅에서는 데이터베이스를 [dubious ]변경하기 전에 원래(변경되지 않은) 데이터를 로그에 복사함으로써 내구성이 보증됩니다.그러면 크래시 발생 시 데이터베이스가 일관된 상태로 돌아갈 수 있습니다.섀도잉에서는 업데이트가 데이터베이스의 부분 복사본에 적용되며 트랜잭션이 커밋될 때 새 복사본이 활성화됩니다.

잠금 vs. 멀티버전

많은 데이터베이스는 ACID 기능을 제공하기 위해 잠금을 사용합니다.잠금은 트랜잭션이 액세스하는 데이터를 표시하여 첫 번째 트랜잭션이 성공하거나 실패할 때까지 다른 트랜잭션이 해당 트랜잭션을 수정할 수 없도록 하는 것을 의미합니다.읽었지만 수정되지 않은 데이터를 포함하여 데이터를 처리하기 전에 항상 잠금을 획득해야 합니다.단순하지 않은 트랜잭션에는 일반적으로 많은 수의 잠금이 필요하므로 상당한 오버헤드와 다른 트랜잭션이 차단됩니다.예를 들어 사용자 A가 사용자 B가 수정할 데이터 행을 읽어야 하는 트랜잭션을 실행하는 경우 사용자 B는 사용자 A의 트랜잭션이 완료될 때까지 기다려야 합니다.완전한 분리를 보장하기 위해 종종 2상 잠금이 적용됩니다.

잠금 대신 다중 버전 동시성 제어가 있습니다. 이 제어에서는 데이터베이스가 다른 활성 트랜잭션에 의해 수정되는 데이터의 수정되지 않은 이전 버전을 각 읽기 트랜잭션에 제공합니다.이를 통해 독자는 잠금을 획득하지 않고도 작동할 수 있습니다. 즉, 쓰기 트랜잭션은 읽기 트랜잭션을 차단하지 않으며, 독자는 쓰기 트랜잭션을 차단하지 않습니다.예를 들어 사용자 A의 트랜잭션이 사용자 B가 수정 중인 데이터를 요청하면 데이터베이스는 사용자 B가 트랜잭션을 시작할 때 존재했던 데이터 버전을 A에 제공합니다.사용자 A는 다른 사용자가 데이터를 변경하는 경우에도 일관된 데이터베이스 보기를 얻을 수 있습니다.스냅샷 격리를 구현하면 격리 속성이 완화됩니다.

분산 트랜잭션

단일 노드가 트랜잭션에 영향을 미치는 모든 데이터를 책임지지 않는 분산 데이터베이스 간의 분산 트랜잭션에서 ACID 속성을 보장하는 것은 추가적인 복잡성을 야기합니다.네트워크 연결이 실패하거나 한 노드가 트랜잭션의 일부를 성공적으로 완료한 후 다른 노드의 장애로 인해 변경 사항을 롤백해야 할 수 있습니다.2단계 커밋 프로토콜(2단계 잠금과 혼동하지 않음)은 분산 트랜잭션에 원자성을 제공하여 트랜잭션의 각 참가자가 트랜잭션을 커밋해야 하는지 [10]여부에 대해 동의하도록 보장합니다.간단히 말하면, 첫 번째 단계에서는 한 노드(코디네이터)가 다른 노드(참가자)를 심문하고, 준비되었다는 모든 응답이 있을 때만 두 번째 단계에서는 코디네이터가 트랜잭션을 공식화한다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Lang, Niklas (2022-07-05). "Database Basics: ACID Transactions". Medium. Retrieved 2022-08-06.
  2. ^ Haerder, T.; Reuter, A. (1983). "Principles of transaction-oriented database recovery". ACM Computing Surveys. 15 (4): 287. CiteSeerX 10.1.1.115.8124. doi:10.1145/289.291. S2CID 207235758.
  3. ^ Gray, Jim (September 1981). "The Transaction Concept: Virtues and Limitations" (PDF). Proceedings of the 7th International Conference on Very Large Databases. Cupertino, CA: Tandem Computers. pp. 144–154. Retrieved March 27, 2015.
  4. ^ Gray, Jim; Reuter, Andreas (1993). Distributed Transaction Processing: Concepts and Techniques. Morgan Kaufmann. ISBN 1-55860-190-2.
  5. ^ "Atomic operation". webopedia.com. Webopedia. 25 November 2003. Retrieved 2011-03-23. An operation during which a processor can simultaneously read a location and write it in the same bus operation. This prevents any other processor or I/O device from writing or reading memory until the operation is complete.
  6. ^ Amsterdam, Jonathan. "Atomic File Transactions, Part 1". O'Reilly. Archived from the original on 2016-03-03. Retrieved 2016-02-28.
  7. ^ C. J. 날짜, "SQL과 관계 이론:정확한 SQL 코드 작성 방법", O'illy Media, Inc., 2012, 페이지 180.
  8. ^ "데이터베이스 엔진에서의 격리 수준", Technet, Microsoft, https://technet.microsoft.com/en-us/library/ms189122(v=SQL.105).aspx
  9. ^ "Atomicity". docs.oracle.com. Retrieved 2016-12-13.
  10. ^ Bernstein, Philip A.; Newcomer, Eric (2009). "Chapter 8". Principles of Transaction Processing (2nd ed.). Morgan Kaufmann (Elsevier). ISBN 978-1-55860-623-4. Archived from the original on 2010-08-07.