다중 버전 동시성 제어

Multiversion concurrency control

다중 버전 동시성 제어(MCC 또는 MVCC)는 데이터베이스 관리 시스템에서 일반적으로 사용되는 동시성 제어 방식이며 트랜잭션 [1]메모리를 구현하기 위한 프로그래밍 언어 및 데이터베이스에 대한 동시 액세스를 제공합니다.

묘사

동시성 제어가 없는 경우, 다른 사용자가 데이터베이스에 쓰는 것과 동시에 다른 사용자가 데이터베이스에서 읽고 있는 경우, 독자는 반쯤 작성되었거나 일관성이 없는 데이터를 볼 수 있습니다.예를 들어, 두 계좌 간에 송금을 할 때, 원래 계좌에서 돈이 인출되었을 때와 목적지 계좌에 입금되기 전에 독자가 은행의 잔액을 읽으면, 은행에서 돈이 사라진 것처럼 보입니다.격리는 데이터에 대한 동시 액세스를 보장하는 속성입니다.격리는 동시성 제어 프로토콜에 의해 구현된다.가장 간단한 방법은 모든 독자들이 라이터가 끝날 때까지 기다리도록 하는 것인데, 이를 읽기-쓰기 잠금이라고 합니다.잠금 기능은 특히 긴 읽기 트랜잭션과 업데이트 트랜잭션 간에 경합을 발생시키는 것으로 알려져 있습니다.MVCC는 각 데이터 항목의 복사본을 여러 개 보관하여 문제를 해결하는 것을 목표로 합니다.이렇게 데이터베이스에 연결된 각 사용자는 특정 시점에 데이터베이스의 스냅샷을 볼 수 있습니다.라이터가 변경한 내용은 변경이 완료될 때까지(또는 데이터베이스 용어로는 트랜잭션이 커밋될 때까지) 데이터베이스의 다른 사용자에게 표시되지 않습니다.

MVCC 데이터베이스는 데이터를 업데이트해야 할 경우 원래 데이터 항목을 새 데이터로 덮어쓰지 않고 데이터 항목의 새 버전을 만듭니다.따라서 여러 버전이 저장됩니다.각 트랜잭션에 표시되는 버전은 구현된 분리 수준에 따라 달라집니다.MVCC에서 구현되는 가장 일반적인 분리 수준은 스냅샷 분리입니다.스냅샷 격리를 사용하면 트랜잭션은 트랜잭션이 시작된 때와 마찬가지로 데이터 상태를 관찰합니다.

MVCC는 시점별로 일관된 뷰를 제공합니다.MVCC에서 읽기 트랜잭션은 일반적으로 타임스탬프 또는 트랜잭션 ID를 사용하여 읽을 DB 상태를 결정하고 이러한 데이터 버전을 읽습니다.따라서 읽기 및 쓰기 트랜잭션은 잠글 필요 없이 서로 격리됩니다.그러나 잠금이 필요 없음에도 불구하고 Oracle과 같은 일부 MVCC 데이터베이스에서 잠금이 사용됩니다.쓰기는 새 버전을 생성하는 반면 동시 읽기는 이전 버전에 액세스합니다.

MVCC는 구식이 되어 읽을 수 없는 버전을 삭제하는 방법을 제시합니다.경우에 따라서는 오래된 버전을 정기적으로 스위프하여 삭제하는 프로세스가 구현됩니다.이것은 보통 전체 테이블을 통과하여 각 데이터 항목의 마지막 버전으로 다시 쓰는 일반적인 프로세스입니다.포스트그레SQL은 VACUM FREZE 프로세스에서 이 방법을 사용할 수 있습니다.다른 데이터베이스는 스토리지 블록을 데이터 부분과 실행 취소 로그의 두 부분으로 나눕니다.데이터 부분은 항상 마지막으로 커밋된 버전을 유지합니다.실행 취소 로그를 사용하면 이전 버전의 데이터를 다시 생성할 수 있습니다.이 후자의 접근방식의 주요 본질적인 제한사항은 업데이트 집약적인 워크로드가 있는 경우 실행 취소 로그 부분의 공간이 부족하여 해당 스냅샷이 제공되지 않아 트랜잭션이 중단된다는 것입니다.문서 지향 데이터베이스의 경우 전체 문서를 디스크의 인접 섹션에 쓰는 것으로 문서를 최적화할 수도 있습니다.업데이트하면 연결된 비연속 데이터베이스 구조에서 문서 전체를 잘라내거나 유지 관리하는 것이 아니라 문서 전체를 다시 쓸 수 있습니다.

실행

MVCC는 타임스탬프(TS)와 증분 트랜잭션 ID사용하여 트랜잭션의 일관성을 확보합니다.MVCC는 트랜잭션(T)이 여러 버전의 오브젝트를 유지함으로써 데이터베이스 오브젝트(P)를 읽기 위해 기다릴 필요가 없음을 보증합니다.오브젝트 P의 각 버전에는 Read Timestamp(RTS; 읽기 타임스탬프)와 Write Timestamp(WTS; 쓰기 타임스탬프)가 있습니다.이것에 의해, 특정의 트랜잭션i T는, 트랜잭션의 읽기 타임스탬프 RTS(Ti)보다 앞의 오브젝트의 최신 버전을 읽을 수 있습니다.

트랜잭션i T오브젝트 P에 쓰기원하고 동일한 오브젝트에 다른 트랜잭션k T가 발생하는 경우 오브젝트 쓰기 동작(WTS)i 성공시키려면 읽기 타임스탬프 RTSk(T)보다 먼저 읽기 타임스탬프 RTSi(T) < RTSk([clarification needed]T)가 필요합니다.동일한 개체에 대한 이전 Read Timestamp(RTS; 읽기 타임스탬프)를 가진 다른 미결 트랜잭션이 있는 경우 쓰기를 완료할 수 없습니다.매장에 줄을 서 있는 것처럼 앞에 있는 사람이 계산서를 다 쓸 때까지 계산서를 작성할 수 없습니다.

다시 말하면, 모든 오브젝트(P)에는 타임스탬프(TS)가 있지만 트랜잭션i T가 오브젝트에 쓰기를 원하는 경우 트랜잭션에 현재 읽기 타임스탬프 TS(Ti) < RTS(P)보다 이전 타임스탬프(TS)가 있는 경우 트랜잭션은 중단되고 재시작됩니다.(이는 이후의 트랜잭션이 이미 이전 값에 의존하기 때문입니다.)그렇지 않으면 Ti 개체 P의 새 버전을 만들고 새 버전의 읽기/쓰기 타임스탬프 TS를 트랜잭션 TS ← TS(Ti)[2]의 타임스탬프로 설정합니다.

이 시스템의 단점은 여러 버전의 개체를 데이터베이스에 저장하는 비용입니다.한편, 읽기는 차단되지 않으며, 이는 대부분 데이터베이스에서 값을 읽는 워크로드에 중요할 수 있습니다.MVCC는 특히 진정한 스냅샷 격리를 구현하는 데 능숙합니다. 이는 다른 동시성 제어 방법이 불완전하거나 높은 성능 비용을 수반하는 경우가 많습니다.

동시 읽기-쓰기

시간 = 1에서 데이터베이스의 상태는 다음과 같습니다.

시간을 오브젝트 1 오브젝트 2
0 T0의 "Foo" T0의 "막대"
1 T1의 "안녕하세요"

T0은 Object 1="Foo" 및 Object 2="Bar"를 작성했습니다.그 후 T1은 Object 1="Hello"라고 쓰고 Object 2는 원래 값으로 남겼습니다.개체 1의 새 값은 개체 1의 버전 0이 가비지 수집될 수 있는 시점에서 T1이 커밋한 후 시작되는 모든 트랜잭션에 대해 0의 값을 대체합니다.

장기간 실행되는 트랜잭션 T2가 T1 커밋된 후 오브젝트2와 오브젝트1의 읽기 작업을 시작하고 오브젝트2를 삭제하고 오브젝트3="Foo-Bar"를 추가하는 동시 업데이트 트랜잭션 T3이 있는 경우, 데이터베이스 상태는 시간 2에서 다음과 같습니다.

시간을 오브젝트 1 오브젝트 2 오브젝트 3
0 T0의 "Foo" T0의 "막대"
1 T1의 "안녕하세요"
2 (삭제) T3에 의해 T3의 "Foo-Bar"

삭제된 것으로 표시된 오브젝트2 의 시간 2 의 새로운 버전과 새로운 오브젝트3 이 있습니다.T2와 T3가 동시에 실행되므로 T2는 T3가 쓰기를 커밋하기 2 이전(즉, T3가 쓰기를 커밋하기 전) 데이터베이스 버전을 보고 T2는 객체 2="Bar" 및 객체 1="Hello"를 읽습니다.이렇게 하면 다중 버전 동시성 제어가 잠금 없이 스냅샷 분리 읽기를 수행할 수 있습니다.

역사

다중 버전 동시성 제어는 필 번스타인과 네이선 굿맨이 1981년 발표한 논문 "분산 데이터베이스 [3]시스템의 통화 제어"에 자세히 설명되어 있으며, 당시 미국 컴퓨터 회사에서 채용되었다.번스타인과 굿맨의 논문은 1978년 데이비드[4] P의 논문을 인용한다. 리드는 MVCC를 아주 명확하게 묘사하고 있으며 오리지널 작품이라고 주장하고 있다.

MVCC를 탑재한 최초의 상용 데이터베이스 소프트웨어 제품은 1984년에 [5]출시된 VAX Rdb/ELN으로 Jim Starkey가 Digital Equipment Corporation에서 만들었습니다.스타키는 계속해서 상업적으로 성공한[6] 두 번째 MVCC 데이터베이스인 InterBase를 만들었습니다.[7]

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Clojure - Refs and Transactions". clojure.org. Retrieved 2019-04-12.
  2. ^ Ramakrishnan, R. & Gerhke, J. (2000).데이터베이스 관리 시스템Osborne/McGraw-Hill.
  3. ^ Bernstein, Philip A.; Goodman, Nathan (1981). "Concurrency Control in Distributed Database Systems". ACM Computing Surveys.
  4. ^ Reed, David P. (September 21, 1978). "Naming and Synchronization in a Decentralized Computer System". MIT dissertation. Archived from the original on October 25, 2005. Retrieved February 18, 2006.
  5. ^ Gallant, John (9 April 1984). "RDB Gets Mixed Greeting". Computerworld. Retrieved 13 September 2021.
  6. ^ "A reminder of Jim Starkey on the Firebird mailing list (May 26, 2022)".
  7. ^ "A not-so-very technical discussion of Multi Version Concurrency Control". firebirdsql.org. Retrieved 2020-11-12.

추가 정보

  • Gerhard Weikum, Gottfried Vossen, 트랜잭션 정보 시스템: 이론, 알고리즘, 동시 제어회복의 실천, Morgan Kaufmann, 2002, ISBN 1-55860-508-8