스냅샷 분리

Snapshot isolation

데이터베이스 및 트랜잭션 처리(트랜잭션 관리)에서 스냅샷 격리는 트랜잭션에서 실행되는 모든 읽기가 데이터베이스의 일관된 스냅샷을 볼 수 있음을 보증합니다(실제로 데이터베이스 시작 시 마지막으로 커밋된 값을 읽습니다). 트랜잭션 자체는 갱신이 없는 경우에만 정상적으로 커밋됩니다.ade는 해당 스냅샷 이후에 수행된 모든 동시 업데이트와 충돌합니다.

스냅샷 격리는 InterBase, Firebird, Oracle, MySQL,[1] Postgre 등의 주요 데이터베이스 관리 시스템에 채택되어 있습니다.SQL, SQL Anywhere, MongoDB[2]Microsoft SQL Server(2005년 이후).그 주된 이유는 시리얼라이저빌리티보다 뛰어난 퍼포먼스를 실현하면서도 시리얼라이저빌리티가 회피하는 (전부는 아니지만) 대부분의 동시성 이상을 회피하기 때문입니다.실제로 스냅샷 격리는 다중 버전 동시성 제어(MVCC) 내에서 구현되며, 여기서 각 데이터 항목의 생성 값(버전)이 유지됩니다.MVCC는 오브젝트가 기록될 때마다 새로운 버전의 데이터베이스 개체를 생성하고 트랜잭션의 읽기 작업을 허용함으로써 동시성과 성능을 향상시키는 일반적인 방법입니다.(각 객체의) 마지막 관련 버전 중 몇 가지입니다.스냅샷 격리는 ANSI SQL-92 표준에서 금지한 "이상성"을 나타내지 않고 ANSI에 의해 정의된 이상 없는 격리 수준인 "이상성"을 나타내지 않기 때문에 ANSI SQL-92 표준의 격리 수준 정의를 비판하기 위해 사용되어[3] 왔습니다.

스냅샷 격리는 시리얼라이제이션과 구별되지만 오라클에서는 시리얼라이제이션이라고 부르기도 합니다.

정의.

스냅샷 격리 상태에서 실행되는 트랜잭션은 트랜잭션 시작 시 생성된 데이터베이스의 개인 스냅샷에서 작동하는 것으로 보입니다.트랜잭션이 완료되면 스냅샷이 생성된 후 트랜잭션에 의해 업데이트된 값이 외부에서 변경되지 않은 경우에만 성공적으로 커밋됩니다.이러한 기입과 기입의 경합에 의해, 트랜잭션이 중단됩니다.

기입 스큐의 이상에서는, 2개의 트랜잭션(T1, T2)이 동시에 중복하는 데이터 세트(예를 들면, 값 V1, V2)를 읽어, 동시에 서로 다른 트랜잭션(예를 들면, T1의 갱신 V1, T2의 갱신 V2)을 실행해, 마지막으로 동시에 커밋한다.시스템을 직렬화할 수 있는 경우 T1 또는 T2 중 하나가 "처음"으로 발생하고 다른 한 쪽에서는 볼 수 있어야 하기 때문에 이러한 이상은 불가능합니다.반면 스냅샷 분리는 쓰기 스큐 이상을 허용합니다.

구체적인 예로, V1과 V2가 Phil이라는 한 사람이 보유한 두 개의 잔액이라고 가정해 보십시오.은행에서는 V1 또는 V2 중 어느 한쪽이 적자를 낼 수 있도록 합니다.다만, 양쪽의 합계가 음이 되지 않는 경우(즉, V1 + V2 00).두 잔액 모두 현재 100달러입니다.Phil은 V1에서 200달러를 인출하는 T1과 V2에서 200달러를 인출하는 T2의 두 가지 트랜잭션을 동시에 시작합니다.

데이터베이스가 시리얼 가능한 트랜잭션을 보증하는 경우 T1을 코드화하는 가장 간단한 방법은 V1에서 200달러를 차감한 후 V1 + V2 00 이 아직 유지되고 있는지 확인하고 그렇지 않으면 중단하는 것입니다.T2는 마찬가지로 V2에서 200달러를 차감한 후 V1 + V2 0 0을 확인합니다. 트랜잭션이 직렬화되어야 하므로 T1이 먼저 발생하고 V1 = -$100, V2 = $100, T2의 성공을 방해합니다(V1 + (V2 - $200)은 현재 -200이므로 T2가 먼저 발생하거나 T2가 먼저 발생합니다.

단, 데이터베이스가 스냅샷 격리(MVCC) 상태일 경우 T1과 T2는 데이터베이스의 프라이빗 스냅샷에 대해 동작합니다.각각 계정에서 200달러를 차감한 후 스냅샷이 생성되었을 때 유지되었던 다른 계정 값을 사용하여 새로운 합계가 0임을 확인합니다.업데이트 모두 충돌하지 않으므로 둘 다 성공적으로 커밋되어 V1 = V2 = -$100, V1 + V2 = -$200이 됩니다.

다중 버전 동시성 제어(MVCC)를 사용하여 구축된 일부 시스템에서는 동시 작업에 대해 걱정하지 않고 트랜잭션을 진행할 수 있도록 스냅샷 격리를 지원할 수 있으며, 더 중요한 것은 트랜잭션이 최종적으로 커밋되었을 때 모든 읽기 작업을 재검증할 필요가 없다는 점입니다.MVCC는 일련의 최신 이력 일관 상태를 유지하기 때문에 편리합니다.트랜잭션 중에 저장해야 하는 유일한 정보는 업데이트 목록이며, 이 목록은 커밋되기 전에 충돌을 상당히 쉽게 검색할 수 있습니다.다만, MVCC 시스템(MarkLogic 등)에서는, MVCC 와 함께 쓰기를 시리얼화하기 위해서 잠금을 사용하고, 퍼포먼스를 향상시키면서, 한층 더 강력한 「시리얼라이즈」레벨의 분리를 서포트합니다.

회피책

기입 스큐의 이상으로부터 발생하는 잠재적인 부정합성의 문제는, 시리얼화 [4]속성을 적용하기 위해서 트랜잭션에 업데이트를 추가하는 것으로 해결할 수 있습니다(그렇지 않으면 불필요합니다).

충돌을 구체화하다
쓰기-쓰기 경합을 직접 생성하기 위해 두 트랜잭션 모두 업데이트되는 특수 충돌 테이블을 추가합니다.
승진
직접 쓰기-쓰기 경합을 일으키기 위해 하나의 트랜잭션에서 읽기 전용 위치를 "업데이트"하도록 합니다(또는 Oracle의 SELECT FOR UPDATE 등 동등한 프로모션을 사용합니다).

위의 예에서는 숨겨진 제약조건을 명확히 하는 새로운 표를 추가하여 각 사람을 전체 균형에 매핑함으로써 충돌을 구체화할 수 있습니다.Phil은 총 잔액 200달러에서 시작하여 각 거래에서 200달러를 공제하려고 시도하여 쓰기-쓰기 충돌이 발생하여 동시에 성공할 수 없게 됩니다.단, 이 접근방식은 통상적인 형식에 위배됩니다.

또는 트랜잭션 읽기 중 하나를 글로 승격할 수 있습니다.예를 들어, T2는 V1 = V1을 설정하여 T1과 인위적인 쓰기-쓰기 충돌을 유발하고, 다시 말해 두 개의 동시 성공을 방해할 수 있습니다.이 솔루션이 항상 가능한 것은 아닐 수 있습니다.

따라서 일반적으로 스냅샷 격리는 사용자에게 중요하지 않은 제약 조건을 유지하는 문제의 일부를 안겨주며, 사용자는 잠재적인 함정이나 가능한 솔루션을 인식하지 못할 수 있습니다.이 전송의 장점은 퍼포먼스가 향상된다는 것입니다.

용어.

Oracle 및 Postgre에서는 스냅샷[5][6][7] 분리를 "시리얼화 가능" 모드라고 부릅니다.9.[8][9][10]1 이전 버전의 SQL에서는 "리얼 시리얼라이저빌리티" 모드와 혼동될 수 있습니다.이 결정에 대해서는 찬반 양론이 있습니다.분명한 것은 데이터베이스 시스템로직에서 바람직하지 않은 비정상적인 동작이 발생하지 않도록 사용자가 구별을 인식할 필요가 있다는 것입니다.

역사

스냅샷 격리는 멀티버전 동시성 제어 데이터베이스에서 발생하였습니다.이 데이터베이스에서는 여러 버전이 동시에 유지되어 독자가 라이터와 충돌하지 않고 실행할 수 있습니다.이러한 시스템은 그러한 격리 [3]수준의 자연스러운 정의와 구현을 가능하게 한다.나중Borland가 소유하게 된 InterBase는 버전 [3]4에서 완전한 시리얼라이제이션이 아닌 SI를 제공하는 것으로 인정되어 1985년 [11]첫 출시 이후 쓰기-스큐 이상을 허용했을 가능성이 있습니다.

유감스럽게도 ANSI SQL-92 표준은 잠금 기반 데이터베이스를 염두에 두고 작성되었기 때문에 MVCC 시스템에 적용할 경우 다소 모호합니다.Berenson은 1995년에 SQL[3] 표준을 비판하는 논문을 썼고, ANSI SQL-92 표준에 기술된 표준 이상을 나타내지 않는 격리 수준의 예로 스냅샷 격리를 인용했지만, 직렬화 가능한 트랜잭션과 비교할 때 여전히 비정상적인 동작을 보였다.

2008년, Cahill 등은 동시 트랜잭션의 "위험한"[12] 세 개를 검출하여 중단함으로써 쓰기-스큐 이상을 방지할 수 있음을 보여주었다.이 시리얼라이제빌리티의 실장은 다중버전 동시제어 데이터베이스에 적합하며 Postgre에서 채택되었습니다.SQL 9.[9][10][13]1에서는 "Serializable Snapshot Isolation(시리얼화 가능한 스냅샷 격리)"(SSI로 약칭)이라고 합니다.이를 일관되게 사용하면 위의 회피책이 필요하지 않습니다.스냅샷 격리의 단점은 중단된 트랜잭션이 증가한다는 것입니다.이 방법은 워크로드에 따라 위의 해결 방법에서 스냅샷 분리보다 성능이 더 좋거나 더 나쁠 수 있습니다.

레퍼런스

  1. ^ "MySQL :: MySQL 8.0 Reference Manual :: 15.5.2.3 Consistent Nonlocking Reads". dev.mysql.com. Retrieved 2018-08-27.
  2. ^ MongoDB, MongoDB CTO의 멀티버전 동시성 제어: 새로운 WiredTiger 스토리지 엔진의 스트라이프 획득 방법
  3. ^ a b c d Berenson, Hal; Bernstein, Phil; Gray, Jim; Melton, Jim; O'Neil, Elizabeth; O'Neil, Patrick (1995), "A Critique of ANSI SQL Isolation Levels", Proceedings of the 1995 ACM SIGMOD international Conference on Management of Data, pp. 1–10, arXiv:cs/0701157, doi:10.1145/223784.223785, ISBN 978-0897917315
  4. ^ Fekete, Alan; Liarokapis, Dimitrios; O'Neil, Elizabeth; O'Neil, Patrick; Shasha, Dennis (2005), "Making Snapshot Isolation Serializable", ACM Transactions on Database Systems, 30 (2): 492–528, CiteSeerX 10.1.1.503.3169, doi:10.1145/1071610.1071615, ISSN 0362-5915
  5. ^ Oracle Database Concepts 10g Release 1 (10.1) 13장: 데이터 동시성과 일관성 - Oracle 격리 수준
  6. ^ 톰에게 묻다: 트랜잭션 격리 수준
  7. ^ 톰에게 묻습니다: "시리얼화 가능한 트랜잭션"
  8. ^ PostgreSQL 9.0 매뉴얼: 13.2.2.1.시리얼화 가능한 격리 기능과 진정한 시리얼화 기능 비교
  9. ^ a b PostgreSQL 9.1 프레스 릴리즈
  10. ^ a b PostgreSQL 9.1.14 문서: 13.2.3.시리얼화 가능한 격리 수준
  11. ^ Stuntz, Craig. "Multiversion Concurrency Control Before InterBase". Retrieved October 30, 2014.
  12. ^ 마이클 J. 케힐, 우베 뢰엠, 앨런 D.Fekete (2008) "스냅샷 데이터베이스의 시리얼화 가능한 격리", 2008년 ACM SIGMOD 데이터 관리에 관한 국제회의 속행, 729–738, ISBN 978-1-60558-102-6 (SIGMOD 2008 베스트 페이퍼 어워드)
  13. ^ Ports, Dan R. K.; Grittner, Kevin (2012). "Serializable Snapshot Isolation in PostgreSQL" (PDF). Proceedings of the VLDB Endowment. 5 (12): 1850–1861. arXiv:1208.4179. CiteSeerX 10.1.1.294.3803. doi:10.14778/2367502.2367523.

추가 정보

  • Bettina Kemme, Gustavo Alonso, 열렬한 데이터베이스 복제 프로토콜 개발구현을 위한 새로운 접근법, ACM Transactions on Database Systems(TODS), v.25 n.3, 페이지 333-379, 9월2000.
  • Gerhard Weikum, Gottfried Vossen, 트랜잭션 정보 시스템: 이론, 알고리즘, 동시 제어회복의 실천, Morgan Kaufmann, 2002, ISBN 1-55860-508-8
  • 이린, 베티나 켐메, 마르타 파티뇨 마르티네스, 리카르도 히메네스 페리스스냅샷 격리를 제공하는 미들웨어 기반 데이터 복제.2005년 ACM SIGMOD 국제회의, 2005년.
  • 마르타 파티뇨 마르티네즈, 리카르도 히메네스페리스, 베티나 켐메, 구스타보 알론소MIDDLE-R: 미들웨어 레벨에서의 일관된 데이터베이스 리플리케이션.ACM Transactions on Computer Systems(TOCS; 컴퓨터 시스템상의 ACM 트랜잭션)제23권 제4호375-423페이지.
  • Khuzaima Daudjee, Kenneth Salem, 스냅샷 격리를 사용한 Lazy Database Replication, VLDB 2006: 715-726 페이지