스냅샷 격리
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
스냅샷 격리는 트랜잭션이 시작 시점의 데이터베이스 스냅샷에서 작동하는 것처럼 보이는 격리 수준이다. 트랜잭션이 완료될 때, 스냅샷 이후 변경되지 않은 값에 대해서만 커밋이 성공하며, 쓰기-쓰기 충돌이 발생하면 트랜잭션이 중단된다. 스냅샷 격리는 쓰기 왜곡 이상 현상을 허용하며, 이는 두 트랜잭션이 동시에 데이터를 읽고, 각자 다른 업데이트를 수행하며, 서로의 업데이트를 보지 못한 채 커밋될 때 발생한다. 이러한 문제를 해결하기 위해 충돌 구체화 또는 승격과 같은 해결 방법이 사용될 수 있다. 스냅샷 격리는 다중 버전 동시성 제어(MVCC)를 사용하여 구현되며, 오라클 데이터베이스와 PostgreSQL에서 사용된다.
더 읽어볼만한 페이지
- 동시성 제어 - 세마포어
세마포어는 데이크스트라가 고안한 정수 변수로, P/V 연산을 통해 자원 접근을 제어하고 동기화 문제를 해결하며, 계수 세마포어와 이진 세마포어로 나뉘어 멀티스레드 환경에서 자원 관리 및 스레드 동기화에 기여한다. - 동시성 제어 - 모니터 (동기화)
모니터는 공유 자원 접근을 제어하여 프로세스 간 동기화를 구현하는 프로그래밍 구조로, 뮤텍스 락, 조건 변수 등으로 구성되어 경쟁 상태를 방지하며 여러 프로그래밍 언어에서 지원된다. - 트랜잭션 처리 - 2단계 커밋 프로토콜
2단계 커밋 프로토콜은 분산 컴퓨팅 환경에서 트랜잭션의 원자성을 보장하는 분산 알고리즘으로, 조정자와 참가자로 구성되어 모든 참가자가 트랜잭션을 완료하거나 아무도 완료하지 못하도록 하며, 커밋 요청 및 커밋 단계를 거쳐 모든 참가자의 동의를 얻어야 커밋된다. - 트랜잭션 처리 - 온라인 트랜잭션 처리
온라인 트랜잭션 처리(OLTP)는 실시간 데이터베이스 트랜잭션 처리 방식으로, 가용성, 속도, 동시성, 내구성을 목표로 은행, 항공사, 전자 상거래 등에서 활용된다. - 데이터베이스 - 지식 베이스
지식 베이스는 특정 주제 정보를 체계적으로 저장 및 관리하며 규칙 기반 추론으로 새로운 지식 도출에 활용되고, 웹 콘텐츠 관리 및 지식 관리 시스템으로 확장되어 온톨로지를 이용, 인공지능 기술과 결합하여 문제 해결책을 제시하고 경험을 통해 학습하는 시스템이다. - 데이터베이스 - 화이트리스트
화이트리스트는 특정 대상만 허용하고 나머지는 차단하는 접근 제어 목록으로, 정보보안, 무역, 금융 등 다양한 분야에서 활용되지만, 목록 선정 기준의 불명확성, 사회적 문제점 등의 위험성으로 투명하고 엄격한 관리가 필요하다.
스냅샷 격리 | |
---|---|
격리 수준 | |
스냅샷 격리 | 스냅샷 격리 |
설명 | |
스냅샷 격리 | 데이터베이스 관리 시스템의 트랜잭션 격리를 보장하는 동시성 제어 방식이다. |
동작 방식 | 각 트랜잭션은 데이터베이스의 스냅샷에서 작동하며, 트랜잭션 시작 시점의 일관된 데이터 뷰를 제공한다. |
특징 | "더티 읽기"를 방지한다. "비반복 읽기"를 방지한다. "갱신 손실"을 방지한다. "쓰기 스큐"를 발생시킬 수 있다. |
구현 | |
구현 데이터베이스 | 파이어버드 인터베이스 오라클 (직렬화 가능 스냅샷 격리) 포스트greSQL (직렬화 가능 스냅샷 격리) Microsoft SQL Server MySQL (InnoDB) 볼트DB 클라우드 스팬너 예르나 |
격리 수준 | |
ANSI SQL-92 | 직렬화 가능 |
단점 | |
쓰기 스큐 문제 | 스냅샷 격리는 읽기-쓰기 의존성이 있는 트랜잭션에서 쓰기 스큐 문제를 발생시킬 수 있다. |
직렬화 오류 | 직렬화 가능 스냅샷 격리를 사용하지 않는 경우, 직렬화 가능이 필요한 트랜잭션에서 오류가 발생할 수 있다. |
같이 보기 | |
관련 항목 | 직렬화 가능 스냅샷 격리 격리 낙관적 동시성 제어 다중 버전 동시성 제어 |
2. 정의
스냅샷 격리에서 트랜잭션은 트랜잭션 시작 시점에 생성된 데이터베이스의 '스냅샷'에서 작동하는 것처럼 보인다. 트랜잭션 완료 시, 해당 트랜잭션에 의해 업데이트된 값이 스냅샷 생성 이후 외부에서 변경되지 않은 경우에만 성공적으로 커밋된다. 이러한 쓰기-쓰기 충돌 발생 시 트랜잭션은 중단된다.[1]
하지만 스냅샷 격리는 쓰기 왜곡(Write Skew) 현상을 발생시킬 수 있다. 쓰기 왜곡에 대한 자세한 설명은 하위 섹션에서 다룬다.
2. 1. 쓰기 왜곡 (Write Skew)
쓰기 왜곡 이상 현상은 두 개의 트랜잭션(T1 및 T2)이 중복되는 데이터 세트를 동시에 읽고, 동시에 분리된 업데이트를 수행하며, 마지막으로 동시에 커밋될 때 서로의 업데이트를 보지 못하는 현상이다.[1] 직렬화 가능(Serializable) 격리 수준에서는 T1 또는 T2 중 하나가 먼저 발생하여 다른 트랜잭션에 보여야 하므로 이러한 이상 현상은 불가능하지만, 스냅샷 격리는 쓰기 왜곡 이상 현상을 허용한다.[1]다중 버전 동시성 제어(MVCC)를 사용하는 시스템은 트랜잭션이 동시 작업에 대해 걱정하지 않고, 트랜잭션이 최종적으로 커밋될 때 모든 읽기 작업을 다시 확인할 필요 없이 진행할 수 있도록 스냅샷 격리만 지원하기도 한다.[1] MVCC는 일련의 최근 기록 일관성 상태를 유지하므로 편리하다.[1] 트랜잭션 중에 저장해야 하는 유일한 정보는 수행된 업데이트 목록이며, 이는 커밋되기 전에 충돌 여부를 쉽게 검사할 수 있다.[1] 일부 MVCC 시스템(예: MarkLogic)은 성능 향상을 꾀하고 더 강력한 "직렬화 가능성" 수준의 격리를 지원하기 위해 MVCC와 함께 잠금을 사용하여 쓰기를 직렬화하기도 한다.[1]
2. 1. 1. 쓰기 왜곡 예시
V1과 V2가 필이라는 한 사람이 보유한 두 개의 잔고라고 가정한다. 은행은 V1 또는 V2 중 하나가 적자를 허용하지만, 두 잔고의 총합은 음수가 아니어야 한다(즉, V1 + V2 ≥ 0). 두 잔고 모두 현재 100USD이다. 필은 두 개의 트랜잭션(T1은 V1에서 200USD 인출, T2는 V2에서 200USD 인출)을 동시에 시작한다.데이터베이스가 직렬화 가능한 트랜잭션을 보장한다면 T1 또는 T2 중 하나가 먼저 실행되어야 한다. 예를 들어 T1이 먼저 실행되면 V1 = -100USD, V2 = 100USD가 되고, 이후 T2는 V1 + (V2 - 200USD) = -200USD가 되므로 성공하지 못한다.
하지만 데이터베이스가 스냅샷 격리를 사용하는 경우, T1과 T2는 데이터베이스의 개인 스냅샷에서 작동한다. 각 트랜잭션은 계좌에서 200USD를 공제한 다음, 스냅샷이 생성되었을 때의 다른 계좌 값을 사용하여 새로운 총액이 0인지 확인한다. "업데이트" 충돌이 없으므로 두 트랜잭션 모두 성공적으로 커밋되어 V1 = V2 = -100USD, V1 + V2 = -200USD가 된다.
3. 동작 원리
스냅샷 격리 하에서 실행되는 트랜잭션은 트랜잭션 시작 시점에 생성된 데이터베이스의 개인적인 '스냅샷'에서 작동하는 것처럼 보인다. 트랜잭션이 완료될 때, 트랜잭션에 의해 업데이트된 값이 스냅샷이 생성된 이후 외부에서 변경되지 않은 경우에만 성공적으로 커밋된다. 이러한 쓰기-쓰기 충돌은 트랜잭션이 중단되도록 한다.
쓰기 왜곡 이상 현상에서 두 개의 트랜잭션(T1 및 T2)은 중복되는 데이터 세트(예: 값 V1 및 V2)를 동시에 읽고, 동시에 분리된 업데이트를 수행하며(예: T1은 V1을 업데이트하고 T2는 V2를 업데이트), 마지막으로 동시에 커밋되며, 서로 수행한 업데이트를 보지 못한다. 시스템이 직렬화 가능하다면 T1 또는 T2 중 하나가 "먼저" 발생하여 다른 트랜잭션에 보여야 하므로 이러한 이상 현상은 불가능하다. 반대로, 스냅샷 격리는 쓰기 왜곡 이상 현상을 허용한다.
구체적인 예시로, V1과 V2가 필이라는 한 사람이 보유한 두 개의 잔고라고 상상해 보자. 은행은 V1 또는 V2 중 하나가 적자를 허용하지만, 두 잔고의 총합은 음수가 아니어야 한다(즉, V1 + V2 ≥ 0). 두 잔고 모두 현재 100USD이다. 필은 두 개의 트랜잭션을 동시에 시작한다. T1은 V1에서 200USD를 인출하고, T2는 V2에서 200USD를 인출한다.
데이터베이스가 직렬화 가능한 트랜잭션을 보장한다면, T1을 코딩하는 가장 간단한 방법은 V1에서 200USD를 공제한 다음 V1 + V2 ≥ 0이 여전히 유효한지 확인하고, 그렇지 않으면 중단하는 것이다. T2는 유사하게 V2에서 200USD를 공제한 다음 V1 + V2 ≥ 0을 확인한다. 트랜잭션은 직렬화되어야 하므로 T1이 먼저 발생하여 V1 = −100USD, V2 = 100USD가 되고 T2가 성공하지 못하게 되거나(V1 + (V2 − 200USD)가 이제 −200USD이므로), T2가 먼저 발생하여 T1이 커밋되지 못하게 된다.
하지만 데이터베이스가 스냅샷 격리(다중 버전 동시성 제어)를 사용하는 경우, T1과 T2는 데이터베이스의 개인 스냅샷에서 작동한다. 각 트랜잭션은 계정에서 200USD를 공제한 다음, 스냅샷이 생성되었을 때의 다른 계정 값을 사용하여 새로운 총액이 0인지 확인한다. "업데이트" 충돌이 없으므로 두 트랜잭션 모두 성공적으로 커밋되어 V1 = V2 = −100USD, V1 + V2 = −200USD가 된다.
다중 버전 동시성 제어(MVCC)를 사용하여 구축된 일부 시스템은 트랜잭션이 동시 작업에 대해 걱정하지 않고, 더 중요하게는 트랜잭션이 최종적으로 커밋될 때 모든 읽기 작업을 다시 확인할 필요 없이 진행할 수 있도록 (단지) 스냅샷 격리만 지원할 수 있다. MVCC는 일련의 최근 기록 일관성 상태를 유지하기 때문에 편리하다. 트랜잭션 중에 저장해야 하는 유일한 정보는 수행된 업데이트 목록이며, 이는 커밋되기 전에 충돌을 위해 쉽게 검사할 수 있다. 그러나 MVCC 시스템(예: MarkLogic)은 일부 성능 향상을 얻고 더 강력한 "직렬화 가능성" 수준의 격리를 지원하기 위해 MVCC와 함께 잠금을 사용하여 쓰기를 직렬화한다.
4. 해결 방법 (Workarounds)
직렬성 속성을 적용하기 위해 트랜잭션에 (그렇지 않으면 불필요한) 업데이트를 추가하여 쓰기 왜곡 이상 현상으로 인해 발생할 수 있는 잠재적인 불일치 문제를 해결할 수 있다.[4][5][6][7]
해결 방법으로는 충돌 구체화, 승격 등이 있다. 자세한 내용은 하위 섹션을 참고하면 된다.
스냅샷 격리는 사소하지 않은 제약 조건을 유지하는 문제의 일부를 사용자에게 넘기며, 사용자는 잠재적인 위험이나 가능한 솔루션을 제대로 인식하지 못할 수 있다는 단점이 있다.
4. 1. 충돌 구체화 (Materializing Conflicts)
정규형을 위반하는 단점이 있지만, 특수 충돌 테이블을 추가하여 두 트랜잭션 모두 직접적인 쓰기-쓰기 충돌을 생성하도록 업데이트하여 충돌을 구체화할 수 있다.[4][5][6][7]예를 들어, 각 사람을 '총 잔액'에 매핑하여 숨겨진 제약 조건을 명시적으로 만드는 새로운 테이블을 추가할 수 있다. 필이라는 사람이 총 잔액 200USD로 시작하고, 각 트랜잭션은 여기서 200USD를 빼려고 시도한다. 이렇게 하면 두 트랜잭션이 동시에 성공하지 못하도록 하는 쓰기-쓰기 충돌이 발생한다.
4. 2. 승격 (Promotion)
한 트랜잭션이 읽기 전용 위치를 "업데이트"하여 (값을 동일한 값으로 대체) 직접적인 쓰기-쓰기 충돌을 생성하거나 (예: 오라클의 SELECT FOR UPDATE와 같은) 동등한 승격을 사용한다.[4][5][6][7] 이 방법은 항상 가능하지 않을 수 있다.예를 들어, T2는 V1 = V1을 설정하여 T1과의 인위적인 쓰기-쓰기 충돌을 생성하여 두 트랜잭션이 동시에 성공하지 못하도록 할 수 있다.
5. 용어 (Terminology)
오라클(Oracle)[8][9][10] 및 9.1 이전 버전의 PostgreSQL[11][12][13]에서 "직렬화 가능" 모드로 불리며, 이는 "진정한 직렬화 가능성" 모드와 혼동을 일으킬 수 있다. 이러한 결정에 찬반 양론이 있으며, 분명한 것은 사용자가 데이터베이스 시스템 로직에서 원치 않는 이상 동작을 피하기 위해 이러한 구분을 인지해야 한다는 것이다.
6. 역사 (History)
다중 버전 동시성 제어 데이터베이스에 대한 연구에서 스냅샷 격리가 시작되었으며, 여기서 여러 버전의 데이터베이스를 동시에 유지하여 읽기 작업이 쓰기 작업과 충돌 없이 실행될 수 있도록 하였다. 이러한 시스템은 이러한 격리 수준의 자연스러운 정의와 구현을 허용한다.[3] 인터베이스(InterBase)는 버전 4에서 완전한 직렬 가능성이 아닌 SI를 제공하는 것으로 인정되었으며,[3] 1985년 첫 출시 이후 쓰기 왜곡 이상 현상을 허용했을 가능성이 높다.[14]
2008년 Cahill 외는 동시 트랜잭션의 "위험한" 삼중 항을 감지하고 중단함으로써 쓰기 왜곡 이상 현상을 방지할 수 있음을 보여주었다.[15] 이 직렬 가능성 구현은 다중 버전 동시성 제어 데이터베이스에 적합하며, PostgreSQL 9.1[12][13][16]에서 채택되었으며, 여기서 직렬 가능 스냅샷 격리(SSI)라고 한다.
참조
[1]
웹사이트
MySQL :: MySQL 8.0 Reference Manual :: 15.5.2.3 Consistent Nonlocking Reads
https://dev.mysql.co[...]
2018-08-27
[2]
뉴스
MongoDB CTO: How our new WiredTiger storage engine will earn its stripes
https://www.zdnet.co[...]
Multiversion concurrency control in MongoDB
[3]
간행물
Proceedings of the 1995 ACM SIGMOD international Conference on Management of Data
[4]
저널
Making Snapshot Isolation Serializable
[5]
논문
Serializable isolation for snapshot databases
http://portal.acm.or[...]
Proceedings of the 2008 ACM SIGMOD international conference on Management of data
2008
[6]
논문
Serializable isolation for snapshot databases
http://portal.acm.or[...]
Proceedings of the 2008 ACM SIGMOD international conference on Management of data
2008
[7]
문서
Snapshot Isolation and Serializable Execution
http://www.it.usyd.e[...]
The university of Sydney (Australia)
2009
[8]
웹사이트
Oracle Database Concepts 10g Release 1 (10.1) Chapter 13 : Data Concurrency and Consistency — Oracle Isolation Levels
http://docs.oracle.c[...]
[9]
웹사이트
Ask Tom : On Transaction Isolation Levels
http://asktom.oracle[...]
[10]
웹사이트
Ask Tom : "Serializable Transaction"
http://asktom.oracle[...]
[11]
웹사이트
PostgreSQL 9.0 Documentation: 13.2.2.1. Serializable Isolation versus True Serializability
http://www.postgresq[...]
[12]
웹사이트
PostgreSQL 9.1 press release
http://www.postgresq[...]
[13]
웹사이트
PostgreSQL 9.1.14 Documentation: 13.2.3. Serializable Isolation Level
http://www.postgresq[...]
[14]
웹사이트
Multiversion Concurrency Control Before InterBase
https://web.archive.[...]
2014-10-30
[15]
논문
Serializable isolation for snapshot databases
http://portal.acm.or[...]
Proceedings of the 2008 ACM SIGMOD international conference on Management of data
2008
[16]
저널
Serializable Snapshot Isolation in PostgreSQL
http://drkp.net/drkp[...]
[17]
웹사이트
Oracle Database Concepts 10g Release 1 (10.1) Chapter 13 : Data Concurrency and Consistency — Oracle Isolation Levels
http://docs.oracle.c[...]
[18]
웹사이트
Ask Tom : On Transaction Isolation Levels
http://asktom.oracle[...]
[19]
웹사이트
Ask Tom : "Serializable Transaction"
http://asktom.oracle[...]
[20]
웹사이트
PostgreSQL 9.0 Documentation: 13.2.2.1. Serializable Isolation versus True Serializability
http://www.postgresq[...]
[21]
웹사이트
PostgreSQL 9.1 press release
http://www.postgresq[...]
[22]
웹사이트
PostgreSQL 9.1.14 Documentation: 13.2.3. Serializable Isolation Level
http://www.postgresq[...]
[23]
웹인용
MySQL :: MySQL 8.0 Reference Manual :: 15.5.2.3 Consistent Nonlocking Reads
https://dev.mysql.co[...]
2018-08-27
[24]
뉴스
MongoDB CTO: How our new WiredTiger storage engine will earn its stripes
https://www.zdnet.co[...]
Multiversion concurrency control in MongoDB
[25]
인용
Proceedings of the 1995 ACM SIGMOD international Conference on Management of Data
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com