격리(데이터베이스 시스템)

Isolation (database systems)

데이터베이스 시스템에서는 분리에 따라 트랜잭션 무결성이 다른 사용자와 시스템에 어떻게 표시되는지 결정됩니다.

분리 수준이 낮을수록 많은 사용자가 동일한 데이터에 동시에 액세스할 수 있지만 사용자에게 발생할 수 있는 동시성 효과(더티 읽기 또는 업데이트 손실 등)의 수는 증가합니다.반대로 분리 수준이 높을수록 사용자가 직면할 수 있는 동시성 효과의 유형은 감소하지만 더 많은 시스템 리소스가 필요하며 하나의 트랜잭션이 [1]다른 트랜잭션을 차단할 가능성이 높아집니다.

분리는 일반적으로 데이터베이스 수준에서 한 작업에 의해 이루어진 변경 내용이 다른 작업에 표시되는 방법 또는 시기를[clarification needed] 정의하는 속성으로 정의됩니다.오래된 시스템에서는 예를 들어 임시 테이블을 사용하여 시스템적으로 구현될 수 있습니다.2계층 시스템에서는 분리를 유지하기 위해 트랜잭션 처리(TP) 관리자가 필요합니다.n-계층 시스템(예: 비행기의 마지막 좌석을 예약하려는 여러 웹 사이트)에서 예약을 확정하고 고객에게 [2]확인서를 보내려면 저장 프로시저와 트랜잭션 관리를 조합해야 합니다.

분리는 원자성, 일관성내구성과 함께 4가지 ACID 특성 중 하나입니다.

동시성 제어

동시성 제어는 분리를 처리하고 관련 정확성을 보장하는 DBMS의 기본 메커니즘으로 구성됩니다.데이터베이스 및 스토리지 엔진에서 동시 트랜잭션의 올바른 실행을 보장하고 다른 DBMS 프로세스의 정확성을 보장하기 위해 많이 사용됩니다.트랜잭션 관련 메커니즘은 일반적으로 데이터베이스 데이터 액세스 작업의 타이밍(트랜잭션 스케줄)을 직렬화복구 가능성 스케줄 속성으로 특징지어지는 특정 주문으로 제한합니다.데이터베이스 액세스 조작의 실행을 제한하는 것은 일반적으로 퍼포먼스의 저하(실행 레이트로 측정)를 의미합니다.따라서 동시성 제어 메커니즘은 일반적으로 제약 조건 하에서 가능한 한 최고의 퍼포먼스를 제공하도록 설계되어 있습니다.정확성을 해치지 않고 가능한 경우 성능 향상을 위해 직렬화 속성이 손상되는 경우가 많습니다.그러나 복구 기능은 일반적으로 데이터베이스 무결성 위반이 발생하기 때문에 손상되어서는 안 됩니다.

2단계 잠금은 DBMS에서 가장 일반적인 트랜잭션 동시성 제어 방법으로, 정확성을 위한 직렬화와 복구 기능을 모두 제공하기 위해 사용됩니다.데이터베이스 개체에 액세스하려면 트랜잭션에서 먼저 이 개체에 대한 잠금을 획득해야 합니다.액세스 조작 타입(예를 들어 오브젝트 읽기 또는 쓰기) 및 록 타입에 따라서는 다른 트랜잭션이 해당 오브젝트에 대해 잠금을 유지하고 있는 경우 록 취득이 차단 및 연기될 수 있다.

현상을 읽다

ANSI/ISO 표준 SQL 92는 트랜잭션 1이 트랜잭션 2가 변경되었을 가능성이 있는 데이터를 읽을 때 세 가지 읽기 현상을 참조합니다.

다음 예제에서는 두 개의 트랜잭션이 수행됩니다.첫 번째로 Query 1이 실행됩니다.그런 다음 두 번째 트랜잭션에서 쿼리 2가 수행되고 커밋됩니다.마지막으로 첫 번째 거래에서 Query 1을 다시 실행한다.

쿼리는 다음 데이터 테이블을 사용합니다.

사용자
아이디 이름. 나이
1 조. 20
2 25

지저분한 읽기

더티 읽기(커밋되지 않은 종속성이라고도 함)는 실행 중인 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 행의 데이터를 트랜잭션이 읽을 수 있는 경우에 발생합니다.

더티 읽기는 반복 불가능한 읽기와 유사하게 작동하지만 첫 번째 쿼리에서 다른 결과를 반환하기 위해 두 번째 트랜잭션을 커밋할 필요는 없습니다.READ UNCOMMITED 분리 수준에서 방지할 수 있는 유일한 것은 결과에서 잘못된 업데이트가 나타나는 것입니다. 즉, 이전 업데이트는 나중에 업데이트하기 전에 항상 결과 세트에 표시됩니다.

이 예에서는 트랜잭션2가 행을 변경하지만 변경은 커밋하지 않습니다.트랜잭션 1은 커밋되지 않은 데이터를 읽습니다.트랜잭션 2가 변경 내용을 롤백하거나(트랜잭션 1에 의해 이미 읽혀짐) 데이터베이스의 다른 변경 내용을 업데이트하면 트랜잭션 1의 기록에서 데이터 보기가 잘못될 수 있습니다.

트랜잭션 1 트랜잭션 2
/* 쿼리 1 */ 선택한다. 나이 부터 사용자 어디에 아이디 = 1; /* 는 20 */ 로 표시됩니다. 
/* 쿼리 2 * / 갱신하다 사용자 세트 나이 = 21 어디에 아이디 = 1; /* 여기에 커밋 없음 */ 
/* 쿼리 1 */ 선택한다. 나이 부터 사용자 어디에 아이디 = 1; /*는 21 */로 표시됩니다. 
롤백; /* 잠금 기반 더티 읽기 */ 

단, 이 경우 ID가 1이고 연령이 21인 행은 존재하지 않습니다.

반복 불가능한 읽기

반복 불가능한 읽기는 트랜잭션 진행 중에 행이 두 번 검색되고 행 내의 값이 읽기 간에 다를 때 발생합니다.

SELECT 실행 시 읽기 잠금을 획득하지 않거나 SELECT 조작이 실행되자마자 해당 행의 획득 잠금을 해제하면 잠금 기반 동시성 제어 방식에서 반복 불가능한 읽기 현상이 발생할 수 있습니다.다중 버전 동시성 제어 방식에서는 커밋 경합에 의해 영향을 받는 트랜잭션이 롤백해야 한다는 요건이 완화되면 반복 불가능한 읽기가 발생할 수 있습니다.

트랜잭션 1 트랜잭션 2
/* 쿼리 1 */ 선택한다. * 부터 사용자 어디에 아이디 = 1; 
/* 쿼리 2 * / 갱신하다 사용자 세트 나이 = 21 어디에 아이디 = 1; 저지르다; /*(멀티버전 동시성) 제어 또는 잠금 기반 읽기 커밋*/ 
/* 쿼리 1 */ 선택한다. * 부터 사용자 어디에 아이디 = 1; 저지르다; /* 잠금 기반 반복 가능 읽기 */ 

이 예에서는 트랜잭션2가 정상적으로 커밋됩니다.즉, ID 1의 행에 대한 변경이 표시됩니다.그러나 트랜잭션 1의 해당 행에는 이미 다른 경과시간 이 있습니다.시리얼 가능 및 반복 가능 읽기 분리 수준에서 DBMS는 두 번째 SELECT의 이전 값을 반환해야 합니다.READ COMMITED 및 READ UNCOMMITED에서 DBMS는 갱신된 값을 반환할 수 있습니다.이것은 반복할 수 없는 읽기입니다.

반복 불가능한 읽기를 방지하기 위해 사용되는 기본 전략은 두 가지가 있습니다.첫 번째는 트랜잭션1이 커밋되거나 롤백될 때까지 트랜잭션2의 실행을 지연시키는 것입니다.이 방법은 잠금을 사용할 때 사용되며 시리얼 스케줄 T1, T2를 생성합니다.시리얼 스케줄은 반복 가능한 읽기 동작을 나타냅니다.

다른 전략에서는 다중 버전 동시성 제어에서 사용되는 것처럼 트랜잭션 2가 먼저 커밋되도록 허용되어 더 나은 동시성을 제공합니다.단, 트랜잭션2보다 먼저 시작된 트랜잭션1은 데이터베이스의 이전 버전(시작된 순간의 스냅샷)에서 계속 작동해야 합니다.트랜잭션1이 최종적으로 커밋을 시도하면 DBMS는 트랜잭션1 커밋 결과가 스케줄 T1, T2와 동일한지 여부를 확인합니다.이 경우 트랜잭션1을 진행할 수 있습니다.단, 동등한 것으로 간주되지 않는 경우 트랜잭션1은 시리얼화 실패와 함께 롤백해야 합니다.

잠금 기반 동시성 제어 방법을 사용하면, REPETABLE READ 분리 모드에서 ID = 1인 행이 잠겨 첫 번째 트랜잭션이 커밋되거나 롤백될 때까지 Query 2를 차단합니다.READ COMMITED 모드에서는 쿼리 1이 두 번째로 실행되었을 때 경과시간이 변경되었습니다.

다중 버전 동시성 제어에서 SERIALFIGLE 분리 수준에서 두 SELECT 쿼리는 트랜잭션 1 시작 시 생성된 데이터베이스의 스냅샷을 봅니다.따라서 동일한 데이터를 반환합니다.단, 트랜잭션2가 해당 행도 갱신하려고 하면 시리얼라이제이션에 실패하고 트랜잭션1이 롤백됩니다.

READ COMMITED 분리 수준에서는 각 쿼리가 시작될 때 생성된 데이터베이스의 스냅샷이 각 쿼리에 표시됩니다.따라서 업데이트된 행에 대해 서로 다른 데이터를 볼 수 있습니다.이 모드에서는 시리얼라이제이션 실패가 발생하지 않습니다(시리얼라이제이션 가능성이 없기 때문에).트랜잭션1을 재시도할 필요가 없습니다.

팬텀 읽기

팬텀 판독은 트랜잭션 진행 중에 다른 트랜잭션에 의해 읽히는 레코드에 새 행이 추가 또는 제거될 때 발생합니다.

문제는 SELECT … WHERE 작업을 수행할 때 범위 잠금을 획득하지 않은 경우에 발생할 수 있습니다.팬텀 판독 이상은 트랜잭션1이 범위 선택... WHERE 쿼리를 반복하고 트랜잭션2가 WHERE 절을 충족하는 새로운 행(예: 대상 테이블 내 삽입)을 작성하는 경우 반복 불가능한 판독의 특수한 경우입니다.

트랜잭션 1 트랜잭션 2
/* 쿼리 1 */ 선택한다. * 부터 사용자 어디에 나이 사이에 10 그리고. 30; 
/* 쿼리 2 * / 삽입 안으로 사용자(아이디, 이름., 나이) 가치 (3, , 27); 저지르다; 
/* 쿼리 1 */ 선택한다. * 부터 사용자 어디에 나이 사이에 10 그리고. 30; 저지르다; 

트랜잭션 1은 동일한 쿼리를 두 번 실행한 점에 유의하십시오.최고 수준의 격리가 유지되는 경우 동일한 행 세트를 두 번 모두 반환해야 합니다.또한 SQL SERIALBLE 격리 수준에서 동작하는 데이터베이스에서도 같은 행 세트가 반환되어야 합니다.그러나 분리 수준이 낮은 경우에는 다른 행 세트가 두 번째로 반환될 수 있습니다.

Serializable 분리 모드에서 Query 1은 10~30 범위의 경과시간이 있는 모든 레코드가 잠기므로 Query 2는 첫 번째 트랜잭션이 커밋될 때까지 차단됩니다.REPEATBLE READ 모드에서는 범위가 잠기지 않으므로 레코드를 삽입할 수 있습니다.따라서 Query 1의 두 번째 문에서는 첫 번째 문과 같은 결과가 반환되지 않습니다.

격리 수준

DBMS(Database Management System)의 4가지 ACID 속성 중 격리 속성은 가장 완화된 속성입니다.DBMS는 최고 수준의 분리를 유지하려고 할 때 일반적으로 데이터의 잠금을 취득하여 동시성이 상실될 수 있으며 다중 버전 동시성 제어를 구현합니다.이를 위해서는 응용 프로그램이 올바르게 작동하려면 논리를 추가해야 합니다.

대부분의 DBMS는 데이터를 선택할 때 발생하는 잠금 정도를 제어하는 여러 트랜잭션 분리 수준을 제공합니다.많은 데이터베이스 애플리케이션에서 데이터베이스 트랜잭션의 대부분은 높은 격리 수준(예를 들어 시리얼 가능 수준)을 필요로 하지 않도록 구성되므로 시스템의 잠금 오버헤드를 줄일 수 있습니다.프로그래머는 데이터베이스 액세스 코드를 신중하게 분석하여 분리를 완화하는 것이 소프트웨어 버그를 발견하기 어려운 원인이 되지 않도록 해야 합니다.반대로 격리 레벨이 높을 경우 교착 상태가 발생할 가능성이 높아지며, 이를 피하기 위한 신중한 분석 및 프로그래밍 기술이 필요합니다.

각 격리 레벨은 아래보다 강하기 때문에 하위 격리 레벨에 의해 금지된 액션이 허용되지 않으므로 표준에서는 DBMS가 요청된 것보다 더 강한 격리 레벨에서 트랜잭션을 실행할 수 있습니다(예: "Read committed" 트랜잭션은 실제로 "Repeatable read" 격리 레벨에서 수행될 수 있습니다).

ANSI/ISO SQL 표준에 의해 정의된 분리 수준은 다음과 같습니다.

시리얼화 가능

이것은 가장 높은 분리 수준입니다.

잠금 기반 동시성 제어 DBMS 구현에서는 트랜잭션 종료 시 읽기 및 쓰기 잠금(선택된 데이터에 대해 획득)을 해제해야 합니다.또한 SELECT 쿼리가 범위 WHERE 절을 사용하는 경우 특히 팬텀 읽기 현상을 방지하기 위해 범위 잠금을 획득해야 합니다.

비잠금 기반 동시성 제어를 사용하는 경우 잠금은 획득되지 않지만 여러 동시 트랜잭션 간에 쓰기 충돌이 감지되면 둘 중 하나만 커밋할 수 있습니다.이 항목에 대한 자세한 내용은 스냅샷 분리를 참조하십시오.

출처: (제2차 비공식 검토 초안) ISO/IEC 9075:1992, 데이터베이스 언어 SQL - 1992년 7월 30일:격리 수준에서의 동시 SQL 트랜잭션 실행은 직렬화가 가능합니다. 직렬화 가능 실행은 동일한 SQL 트랜잭션의 일부 직렬 실행과 동일한 효과를 내는 SQL 트랜잭션을 동시에 실행하는 작업의 실행으로 정의됩니다. 직렬 실행은 각 SQL 트랜잭션이 다음 SQL 트랜잭션이 시작되기 전에 완료될 때까지 실행되는 실행입니다.

반복 가능한 읽기

이 분리 수준에서는 잠금 기반 동시성 제어 DBMS 구현이 트랜잭션이 끝날 때까지 읽기 및 쓰기 잠금(선택된 데이터에 대해 획득)을 유지합니다.그러나 범위 잠금은 관리되지 않으므로 팬텀 읽기가 발생할 수 있습니다.

일부 시스템에서는 이 분리 수준에서 쓰기 스큐가 가능합니다.쓰기 스큐는 두 개의 서로 다른 라이터(업데이트 중인 열을 이전에 읽은 적이 있는 라이터)에 의해 테이블 내의 같은 열에 두 개의 쓰기가 허용되어 열이 [3][4]두 개의 트랜잭션을 혼합한 데이터를 갖는 현상입니다.

읽기 커밋

이 분리 수준에서는 잠금 기반 동시성 제어 DBMS 구현이 트랜잭션 종료까지 쓰기 잠금(선택한 데이터에 대해 취득)을 유지하지만 SELECT 작업이 실행되자마자 읽기 잠금이 해제됩니다(따라서 이 분리 수준에서는 반복 불가능한 읽기 현상이 발생할 수 있습니다).이전 수준과 마찬가지로 범위 잠금은 관리되지 않습니다.

쉽게 말하면, read committed(읽기 커밋)는 모든 데이터 읽기가 읽히는 순간에 커밋되는 것을 보장하는 격리 수준입니다.그것은 단순히 독자들이 중간적이고, 약속되지 않은, 더러운 어떤 읽기도 보지 못하도록 제한한다.트랜잭션이 읽기를 다시 발행할 경우 동일한 데이터를 찾을 것이라는 약속은 전혀 없습니다. 데이터를 읽은 후에는 데이터를 자유롭게 변경할 수 있습니다.

커밋되지 않은 읽기

이것은 가장 낮은 분리 수준입니다.이 수준에서는 더티 읽기가 허용되므로 한 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 변경 사항을 볼 수 있습니다.

기본 분리 수준

DBMS마다 기본 격리 수준은 매우 다양합니다.트랜잭션을 수행하는 대부분의 데이터베이스는 사용자가 분리 단계를 설정할 수 있도록 합니다.일부 DBMS에서는 잠금을 취득하기 위해 SELECT 문을 실행할 때도 추가 구문이 필요합니다(예: 액세스된 행의 배타적 쓰기 잠금을 취득하기 위해 SELECT … FOR UPDATE).

그러나 위의 정의는 모호하고 많은 데이터베이스에 의해 제공되는 분리를 정확하게 반영하지 못한다는 비판을 받고 있습니다.

이 문서에서는 격리 수준을 정의하는 이상 접근 방식의 몇 가지 약점을 보여 줍니다.이 세 가지 ANSI 현상은 모호하고, 심지어 가장 느슨한 해석에서도 일부 비정상적인 행동을 배제하지 않는다… 이것은 몇 가지 반직관적인 결과로 이어진다.특히 잠금 기반 격리 레벨은 ANSI 등가물과는 다른 특성을 가집니다.상용 데이터베이스 시스템은 일반적으로 잠금 구현을 사용하기 때문에 이는 당혹스러운 일입니다.또한 ANSI 현상은 상용 [5]시스템에서 널리 사용되는 여러 유형의 격리 수준 동작을 구별하지 않습니다.

또한 ANSI SQL의 격리 정의에 대한 다른 비판도 있는데, 이는 구현자가 "나쁜 일"을 하도록 장려한다는 것입니다.

... 이는 낙관적 또는 다중 버전의 동시성 체계와는 대조적으로 동시성 제어를 위해 잠금 스키마가 사용된다는 가정에 미묘한 방식으로 의존합니다.이는 제안된 의미론이 잘못 [6]정의되었음을 의미합니다.

격리 수준, 읽기 현상 및 잠금

격리 수준 대 읽기 현상

'+' - 가능
'-' - 불가능


현상을 읽다


격리 수준

지저분한 읽기 업데이트[inconsistent] 손실 반복 불가능한 읽기 팬텀
시리얼화 가능 - - - -
반복 가능한 읽기 - - - +
읽기 커밋 - + + +
읽기 커밋되지 않음 + + + +

Anomaly Serialable은 Serialable과 다릅니다.즉, 일련화 가능한 스케줄에 세 가지 현상 [5]유형이 모두 없어야 하지만 충분하지 않습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "데이터베이스 엔진에서의 격리 수준", TechNet, Microsoft, https://technet.microsoft.com/en-us/library/ms189122(v=SQL.105).aspx
  2. ^ Stony Brook University Computer Science 학부의 23장 "The Architecture of Transaction Processing Systems", 처리 시스템의 진화, 2014년 3월 20일 검색, http://www.cs.sunysb.edu/~http/cse315/23.pdf
  3. ^ Vlad Mihalcea (2015-10-20). "A beginner's guide to read and write skew phenomena".
  4. ^ "Postgresql wiki - SSI".
  5. ^ a b "A Critique of ANSI SQL Isolation Levels" (PDF). Retrieved 29 July 2012.
  6. ^ salesforce (2010-12-06). "Customer testimonials (SimpleGeo, CLOUDSTOCK 2010)". www.DataStax.com: DataStax. Retrieved 2010-03-09. (see above at about 13:30 minutes of the webcast!)

외부 링크