맨위로가기

낙관적 병행 수행 제어

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

낙관적 병행 수행 제어(OCC)는 데이터베이스 트랜잭션의 동시성 제어 기법으로, 트랜잭션 시작 시 타임스탬프를 기록하고, 데이터 수정 후 유효성 검사를 통해 충돌 여부를 확인한다. 웹 환경에서는 HTTP의 ETag를 활용하여 OCC를 구현하며, 데이터베이스 관리 시스템, 프레임워크, 애플리케이션 등 다양한 시스템에서 사용된다. 미디어위키, 버그질라, 루비 온 레일스, GT.M, 마이크로소프트 엔티티 프레임워크, 미머 SQL, 구글 앱 엔진, 아파치 솔라, 엘라스틱서치, CouchDB, MonetDB, 레디스, 파이어버드, 아마존 다이나모DB, 쿠버네티스, 유가바이트DB, Firestore 등이 OCC를 지원하거나 활용하는 시스템의 예시이다.

2. 낙관적 동시성 제어의 단계

낙관적 병행 수행 제어 트랜잭션은 '''시작''', '''수정''', '''유효성 검사''', '''커밋/롤백''' 단계를 거친다.[2] 각 단계에 대한 자세한 설명은 하위 섹션을 참고할 수 있다.

2. 1. 시작

트랜잭션 시작을 표시하는 타임스탬프를 기록한다.[2]

2. 2. 수정

낙관적 병행 수행 제어 트랜잭션에서 수정 단계는 데이터베이스 값을 읽고 변경 사항을 임시로 기록하는 단계이다.[2]

2. 3. 유효성 검사

낙관적 병행 수행 제어 트랜잭션은 다음과 같은 단계를 거친다.[2]

  • '''시작''': 트랜잭션 시작을 표시하는 타임스탬프를 기록한다.
  • '''수정''': 데이터베이스 값을 읽고 변경 사항을 임시로 기록한다.
  • '''유효성 검사''': 다른 트랜잭션이 이 트랜잭션에서 사용한(읽거나 쓴) 데이터를 수정했는지 확인한다. 여기에는 이 트랜잭션 시작 시간 이후에 완료된 트랜잭션과 선택적으로 유효성 검사 시점에 아직 활성 상태인 트랜잭션이 포함된다.
  • '''커밋/롤백''': 충돌이 없으면 모든 변경 사항을 적용한다. 충돌이 발생하면 이를 해결하며, 일반적으로 트랜잭션을 중단하여 해결하지만, 다른 해결 방안도 가능하다. 특히 이 단계와 이전 단계가 단일 원자적 연산으로 수행되지 않는 경우, 확인 시점 사용 시점 버그를 피하도록 주의해야 한다.

2. 4. 커밋/롤백

낙관적 병행 수행 제어 트랜잭션은 다음과 같은 단계를 거친다.[2]

  • '''시작''': 트랜잭션이 시작된 시간을 기록한다.
  • '''수정''': 데이터베이스의 값을 읽고, 변경할 내용을 임시로 저장한다.
  • '''유효성 검사''': 다른 트랜잭션이 현재 트랜잭션이 사용한(읽거나 쓴) 데이터를 변경했는지 확인한다. 이 과정에는 현재 트랜잭션이 시작된 이후 완료된 트랜잭션과, 유효성 검사를 하는 시점에 아직 실행 중인 트랜잭션(선택 사항)이 포함된다.
  • '''커밋/롤백''': 충돌이 없으면 모든 변경 사항을 데이터베이스에 적용한다. 충돌이 발생하면 이를 해결하는데, 보통 트랜잭션을 중단하는 방식으로 해결하지만 다른 방법도 가능하다. 특히 이 단계와 이전 단계(유효성 검사)를 한 번의 원자적 연산으로 처리하지 않으면 확인 시점 사용 시점 버그가 발생할 수 있으므로 주의해야 한다.

3. 웹 환경에서의 활용

무상태 HTTP의 특성상 웹 사용자 인터페이스에서 잠금을 구현하는 것은 불가능하다. 사용자가 레코드 편집을 시작한 후 "취소" 또는 "로그아웃" 링크를 클릭하지 않고 떠나는 경우가 흔하기 때문이다. 잠금을 사용하면 다른 사용자가 동일한 레코드를 편집하려고 할 때 첫 번째 사용자의 잠금이 만료될 때까지 기다려야 한다.

일부 데이터베이스 관리 시스템은 별도의 응용 프로그램 코드 없이도 낙관적 병행 수행 제어(OCC)를 기본적으로 제공한다. 그렇지 않은 시스템의 경우, 응용 프로그램은 데이터베이스 외부에 OCC 계층을 구현하여 대기하거나 레코드를 덮어쓰는 상황을 피할 수 있다. 이때 폼은 레코드의 원본 내용, 타임스탬프, 시퀀스 번호 또는 불투명 토큰을 포함하는 숨겨진 필드를 ব্যবহার할 수 있다. 제출 시 이러한 정보가 데이터베이스의 정보와 비교되고, 만약 다르다면 충돌 해결 알고리즘이 작동한다.

3. 1. HTTP ETag

HTTP는 낙관적 병행 수행 제어(OCC)의 한 형태를 내장하고 있다. 초기 GET 요청에 대한 응답에는 이후 PUT 요청이 `If-Match` 헤더에서 사용할 ETag가 포함될 수 있다. `If-Match` 헤더에 오래된 ETag가 있는 PUT 요청은 거부될 수 있다.[3]

4. 낙관적 동시성 제어 지원 시스템 및 예시

낙관적 동시성 제어(OCC)는 다양한 시스템과 애플리케이션에서 널리 사용된다. 그 예시는 다음과 같다.


  • 대부분의 개정 관리 시스템은 동시성을 위한 "병합" 모델을 지원하며, 이는 OCC의 일종이다.
  • 대부분의 소프트웨어 트랜잭션 메모리 구현은 OCC를 사용한다.

4. 1. DBMS

미머 SQL은 낙관적 병행 제어만 구현하는 DBMS이다.[10] MonetDB는 컬럼 지향 데이터베이스 관리 시스템의 트랜잭션 관리 방식으로 OCC를 기반으로 한다.[15]

4. 2. 프레임워크 및 라이브러리


  • 미디어위키의 편집 페이지는 낙관적 병행 수행 제어(OCC)를 사용한다.[4]
  • 버그질라는 OCC를 사용하며, 편집 충돌은 "공중 충돌"이라고 불린다.[5]
  • 루비 온 레일스 프레임워크는 OCC를 위한 API를 가지고 있다.[6]
  • 그레일스 프레임워크는 기본 규칙에서 OCC를 사용한다.[7]
  • GT.M 데이터베이스 엔진은 트랜잭션 관리를 위해 OCC를 사용한다. (단일 업데이트조차도 미니 트랜잭션으로 처리된다)[8]
  • 마이크로소프트엔티티 프레임워크 (코드 우선 방식 포함)는 바이너리 타임스탬프 값을 기반으로 하는 OCC를 내장 지원한다.[9]
  • 대부분의 개정 관리 시스템은 동시성을 위한 "병합" 모델을 지원하며, 이는 OCC이다.
  • 미머 SQL은 낙관적 병행 제어만 구현하는 DBMS이다.[10]
  • 구글 앱 엔진 데이터 저장소는 OCC를 사용한다.[11]
  • 아파치 솔라 검색 엔진은 _version_ 필드를 통해 OCC를 지원한다.[12]
  • 엘라스틱서치 검색 엔진은 OCC를 통해 문서를 업데이트한다. 문서의 각 버전에는 시퀀스 번호가 할당되며, 최신 버전은 더 높은 시퀀스 번호를 받는다. 문서에 대한 변경 사항이 비동기적으로 도착하면, 소프트웨어는 시퀀스 번호를 사용하여 이전 버전으로 최신 버전을 덮어쓰는 것을 방지할 수 있다.[13]
  • CouchDB는 문서 개정을 통해 OCC를 구현한다.[14]
  • MonetDB 컬럼 지향 데이터베이스 관리 시스템의 트랜잭션 관리 방식은 OCC를 기반으로 한다.[15]
  • 대부분의 소프트웨어 트랜잭션 메모리 구현은 OCC를 사용한다.
  • 레디스는 WATCH 명령을 통해 OCC를 제공한다.[16]
  • 파이어버드는 데이터 관리를 위한 OCC 구현으로 다중 세대 아키텍처를 사용한다.
  • 다이나모DB는 OCC 구현으로 조건부 업데이트를 사용한다.[17]
  • 쿠버네티스는 리소스를 업데이트할 때 OCC를 사용한다.[18]
  • 유가바이트DB는 주로 OCC를 사용하는 클라우드 네이티브 데이터베이스이다.[19]
  • Firestore는 Firebase의 NoSQL 데이터베이스로, 트랜잭션에서 OCC를 사용한다.

4. 3. 애플리케이션

다음은 낙관적 병행 수행 제어(OCC)가 사용되는 애플리케이션 목록이다.

  • 미디어위키 편집 페이지[4]
  • 버그질라 ( 편집 충돌은 "공중 충돌"이라고 불림)[5]
  • 루비 온 레일스 프레임워크 (OCC를 위한 API 제공)[6]
  • 그레일스 프레임워크 (기본 규칙에서 OCC 사용)[7]
  • GT.M 데이터베이스 엔진 (트랜잭션 관리에 OCC 사용, 단일 업데이트도 미니 트랜잭션으로 처리)[8]
  • 마이크로소프트 엔티티 프레임워크 (코드 우선 방식 포함, 바이너리 타임스탬프 값을 기반으로 하는 OCC 내장 지원)[9]
  • 대부분의 개정 관리 시스템 (동시성을 위한 "병합" 모델 지원, OCC의 일종)
  • 미머 SQL (DBMS 중 낙관적 병행 제어만 구현)[10]
  • 구글 앱 엔진 데이터 저장소[11]
  • 아파치 솔라 검색 엔진 (_version_ 필드를 통해 OCC 지원)[12]
  • 엘라스틱서치 검색 엔진 (OCC를 통해 문서 업데이트, 문서의 각 버전에 시퀀스 번호 할당, 최신 버전은 더 높은 시퀀스 번호, 비동기적 변경 시 시퀀스 번호로 이전 버전 덮어쓰기 방지)[13]
  • CouchDB (문서 개정을 통해 OCC 구현)[14]
  • MonetDB 컬럼 지향 데이터베이스 관리 시스템 (트랜잭션 관리 방식이 OCC 기반)[15]
  • 대부분의 소프트웨어 트랜잭션 메모리 구현
  • 레디스 (WATCH 명령을 통해 OCC 제공)[16]
  • 파이어버드 (다중 세대 아키텍처를 사용한 OCC 구현으로 데이터 관리)
  • 다이나모DB (조건부 업데이트를 통한 OCC 구현)[17]
  • 쿠버네티스 (리소스 업데이트 시 OCC 사용)[18]
  • 유가바이트DB (주로 OCC를 사용하는 클라우드 네이티브 데이터베이스)[19]
  • Firestore (Firebase의 NoSQL 데이터베이스, 트랜잭션에서 OCC 사용)

4. 4. 기타


  • 미디어위키의 편집 페이지는 낙관적 병행 수행 제어(OCC)를 사용한다.[4]
  • 버그질라는 OCC를 사용하며, 편집 충돌은 "공중 충돌"이라고 불린다.[5]
  • 루비 온 레일스 프레임워크는 OCC를 위한 API를 가지고 있다.[6]
  • 그레일스 프레임워크는 기본 규칙에서 OCC를 사용한다.[7]
  • GT.M 데이터베이스 엔진은 트랜잭션 관리를 위해 OCC를 사용한다. (단일 업데이트조차도 미니 트랜잭션으로 처리된다).[8]
  • 마이크로소프트엔티티 프레임워크(코드 우선 방식 포함)는 바이너리 타임스탬프 값을 기반으로 하는 OCC를 내장 지원한다.[9]
  • 대부분의 개정 관리 시스템은 동시성을 위한 "병합" 모델을 지원하며, 이는 OCC이다.
  • 미머 SQL은 낙관적 병행 제어만 구현하는 DBMS이다.[10]
  • 구글 앱 엔진 데이터 저장소는 OCC를 사용한다.[11]
  • 아파치 솔라 검색 엔진은 _version_ 필드를 통해 OCC를 지원한다.[12]
  • 엘라스틱서치 검색 엔진은 OCC를 통해 문서를 업데이트한다. 문서의 각 버전에는 시퀀스 번호가 할당되며, 최신 버전은 더 높은 시퀀스 번호를 받는다. 문서에 대한 변경 사항이 비동기적으로 도착하면, 소프트웨어는 시퀀스 번호를 사용하여 이전 버전으로 최신 버전을 덮어쓰는 것을 방지할 수 있다.[13]
  • CouchDB는 문서 개정을 통해 OCC를 구현한다.[14]
  • MonetDB 컬럼 지향 데이터베이스 관리 시스템의 트랜잭션 관리 방식은 OCC를 기반으로 한다.[15]
  • 대부분의 소프트웨어 트랜잭션 메모리 구현은 OCC를 사용한다.
  • 레디스는 WATCH 명령을 통해 OCC를 제공한다.[16]
  • 파이어버드는 데이터 관리를 위한 OCC 구현으로 다중 세대 아키텍처를 사용한다.
  • 다이나모DB는 OCC 구현으로 조건부 업데이트를 사용한다.[17]
  • 쿠버네티스는 리소스를 업데이트할 때 OCC를 사용한다.[18]
  • 유가바이트DB는 주로 OCC를 사용하는 클라우드 네이티브 데이터베이스이다.[19]
  • Firestore는 Firebase의 NoSQL 데이터베이스로, 트랜잭션에서 OCC를 사용한다.

참조

[1] 서적 Expert One-on-One J2EE Design and Development Wrox Press
[2] 뉴스 On Optimistic Methods for Concurrency Control https://apps.dtic.mi[...] ACM Transactions on Database Systems
[3] 웹사이트 Editing the Web - Detecting the Lost Update Problem Using Unreserved Checkout http://www.w3.org/19[...] 1999-05-10
[4] 문서 Help:Edit conflict
[5] 웹사이트 Bugzilla: FAQ: Administrative Questions https://wiki.mozilla[...] 2012-04-11
[6] 웹사이트 Module ActiveRecord::Locking http://api.rubyonrai[...]
[7] 웹사이트 Object Relational Mapping (GORM) http://grails.org/do[...]
[8] 웹사이트 Transaction Processing http://tinco.pair.co[...]
[9] 웹사이트 Handling Concurrency Conflicts https://learn.micros[...] 2023-07-05
[10] 웹사이트 Transaction Concurrency - Optimistic Concurrency Control https://developer.mi[...] 2023-12-22
[11] 웹사이트 The Datastore http://code.google.c[...] 2010-08-27
[12] 웹사이트 Updating Parts of Documents https://lucene.apach[...] 2018-06-28
[13] 웹사이트 Optimistic concurrency control https://www.elastic.[...] 2024-02-05
[14] 웹사이트 Technical Overview https://docs.couchdb[...] 2024-02-06
[15] 웹사이트 Transactions - MonetDB http://www.monetdb.o[...] 2013-01-16
[16] 웹사이트 Transactions in Redis http://redis.io/topi[...]
[17] 웹사이트 Working with Items and Attributes - Conditional Writes https://docs.aws.ama[...] 2020-11-02
[18] 웹사이트 API Overview - Resource Operations https://kubernetes.i[...] 2020-11-03
[19] 웹사이트 Explicit locking {{!}} YugabyteDB Docs https://docs.yugabyt[...] 2022-01-04
[20] 서적 Expert One-on-One J2EE Design and Development Wrox Press
[21] 뉴스 On Optimistic Methods for Concurrency Control https://apps.dtic.mi[...] ACM Transactions on Database Systems 2022-03-29



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com