MySQL의 심도있는 네 개의 주요 트랜잭션 격리 수준의 분석 및 독서의 현상을 해결

이 논문은 트랜잭션 격리 수준 네 가지 종류를 설명하고 예를 통해 현상을 읽기의 어떤 종류를 해결하기 위해 다른 수준을 보여줍니다. 원리 및 관계형 데이터베이스 격리 수준 구현에서 다른.

DBMS에에서, 일련의 동작은, 트랜잭션이 실행되는 모든 또는 모든 실행을 (자성) 될 수 있다는 다른 상태 (일치) 한 상태로부터의 전환을 보장한다. 트랜잭션이 내구성을 충족하기 때문입니다. 트랜잭션이 커밋되면 따라서, 데이터는 아래로 유지 될 수 있으며, 트랜잭션, 격리를 충족시키기 때문에, 그 때문에 다수의 트랜잭션들에 동시에 때문에 동일한 데이터는 서로 독립적으로 직접 거래 복수의 프로세스 때 적절히 분리 레벨을 조절하지 않으면 여러 트랜잭션의 동시 운전시, 그것을 제조 할 수있다 , 반복 불가능한 읽기, 읽기 또는 팬텀 읽기 현상 같은 누락 수정 판독 더티 .

데이터베이스 트랜잭션의 네 ACID 속성에서 격리은 가장 편안한 하나입니다. 데이터베이스는 데이터의 동작 동안 이용 될 수있는 메커니즘 래치 또는 다중 버전 동시성 제어 메커니즘은 더 높은 절연 레벨을 취득한다. 그러나 데이터베이스 격리 수준의 향상과 함께, 데이터 동시성은 감소됩니다. 그래서, 좋은 트레이드 오프를 만드는 방법은 동시성과 고립 사이에 중요한 문제가되고있다.

소프트웨어 개발에서 이러한 문제의 거의 모든 클래스가 우리의 참조를 위해 다양한 최적의 방법이있을 것이다, 많은 DBMS는 잠금을 제어하는 ​​다양한 수준의 동시성 "트랜잭션 격리 수준"의 수를 정의합니다.

직렬화 (직렬화), 반복 읽기 (반복 읽기), 미 확약 읽기 (커밋되지 않은 읽기) (확정 읽기) 커밋 된 읽기 : ANSI / ISO의 표준 SQL 있었다 결국 높은에서, 네 개의 격리 수준을 정의합니다.

다음은 차례로되는 문제 (읽기 현상)이 네 개의 트랜잭션 격리 수준, 사용의 개념 등을 소개합니다

확약 읽기 (커밋되지 않은 읽기)

커밋 읽기 (READ UNCOMMITTED) 분리의 가장 낮은 레벨이다. 우리는 이름으로 알 수있는이 트랜잭션 격리 수준에서 트랜잭션 데이터가 추가되지 않은 트랜잭션을 읽을 수 있습니다.

커밋되지 않은 데이터베이스 잠금 상황 (실현의 원칙)을 읽는

데이터를 열람하는 시점까지의 기간에 서비스는 데이터를 잠금하지 않았다. 트랜잭션이 데이터를 수정할 때 데이터 만 증가 행 레벨 공유 잠금을 .

현상 :

트랜잭션 1은 트랜잭션 2 (데이터에 어떤 잠금 장치로 인해 증가 된 트랜잭션의), 업데이트 이러한 행을 읽을 수있는 행의 기록을 읽고

트랜잭션이 레코드를 업데이트 할 때 트랜잭션 1은 트랜잭션이 공유 읽기 잠금을 추가하기 때문에, 트랜잭션이 공유 읽기 잠금 읽기를 추가 할 수 있습니다 (거래의 기록을 읽을 수 다시 기록, 수정 된 버전 2를 읽고 개정안이 아직 제출되지 않은 경우에도 데이터).

거래 1 행의 기록을 갱신 할 때 트랜잭션이 행은 트랜잭션 1이 끝날 때까지이 업데이트를 할 수 없습니다. (트랜잭션이 읽기 잠금 공유 데이터의 쌍을 추가하기 때문에, 트랜잭션은 두 개의 추가 할 수 없습니다 독점 쓰기 잠금을 데이터를 수정)

예를 들면

트랜잭션 두 문제
/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 20 */
/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; /* No commit here */
/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 21 */
ROLLBACK; /* lock-based DIRTY READ */

나는 아직도 아래에서 빌려 데이터베이스의 현상을 읽기에 두 개의 트랜잭션의 커밋되지 않은 읽기 분리 레벨 사이의 분리를 설명하기 위해 기사의 예를 들었다.

트랜잭션 총 쿼리는 두 번, 두 쿼리의 과정에서, 두 쌍 트랜잭션 데이터 제출 (커밋)하지 않은, 수정되었습니다. 그러나 두 번째 질문의 문제는 두 개의 트랜잭션이 결과를 수정했습니다. 데이터베이스에 현상을 읽기에, 우리는 현상이 우리가 더러운 읽기를 호출 소개했다.

그래서, 더러운 읽기로 이어질 것입니다 확약 읽기

커밋 (커밋 읽기) 읽기

읽기 최선을 다하고 읽기 (COMMITTED READ) 커밋도 이름으로 번역 될 수있다 또한 거래 과정에서 트랜잭션이 커밋되지 않은 경우, 다른 트랜잭션이 데이터를 읽을 수 없습니다, 데이터를 수정, 분석 할 수 있습니다.

데이터베이스 잠금이 읽을 수있는 경우 제출 (실현의 원칙)

플러스 트랜잭션 데이터가 현재 읽고있는 행 수준 잠금 공유 (경우에만 잠금을 읽기) , 행을 읽기에 따라, 행 수준의 즉각적인 석방 공유 잠금;

즉시 업데이트 트랜잭션 데이터 (즉, 순간 업데이트됩니다)에서는, 먼저 추가해야합니다 행 수준 배타적 잠금을 때까지 트랜잭션의 끝이 해제되지 않습니다 .

현상 :

트랜잭션이 라인 레벨의 공유 잠금 경우를 증가하기 때문에 전체 프로세스의 트랜잭션 레코드의 행을 읽고, 트랜잭션이 (두 행에서 행을 읽을 수 트랜잭션이 공유 같은 데이터를 증가시킬 수있다 데이터를 읽을 잠급니다.).

1 트랜잭션 스캔 전환 트랜잭션 데이터만큼 있지만, 2 행의 데이터를 수정할 수 있으며, 즉시 행 트랜잭션 판독 트랜잭션이 라인 데이터를 수정할 수있다. (순간 트랜잭션은 다른 트랜잭션이 데이터 라인 단독 잠금을 높일 수 있습니다, 데이터를 읽어 행 수준 공유 잠금을 증가시킬 것이다. 그러나 한 트랜잭션이 데이터의 행을 읽기로, 행 레벨 공유 잠금은 한 번에 해제됩니다 잠금 해제는 두 개의 트랜잭션) 데이터에 배타적 잠금을 높이고 데이터를 수정할 수 있습니다

트랜잭션이 행 2 개 기록을 갱신하는 경우, 트랜잭션은 한 트랜잭션이 끝날 때까지이 읽을 수있는 라인 또는 업데이트 할 수 없습니다 기록합니다. (트랜잭션 2는 트랜잭션이 데이터를 읽을 잠금을 공유 데이터를 늘릴 수 없습니다 거래 (1)를 제출하지 않은 전에 그렇게 2, 잠금을 해제 할 트랜잭션이 끝날 때까지 행 데이터에 대한 배타적 잠금을 증가, 시간에 데이터를 업데이트합니다. 따라서 독서는 더러운 읽기 현상을 제출 해결할 수 있습니다 )

예를 들면

트랜잭션 두 문제
/* Query 1 */ SELECT * FROM users WHERE id = 1;
/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; COMMIT; /* in multiversion concurrency control, or lock-based READ COMMITTED */
/* Query 1 */ SELECT * FROM users WHERE id = 1; COMMIT; /*lock-based REPEATABLE READ */

커밋 된 읽기 격리 수준에서 거래 전에 제출 된 두 사람은, 트랜잭션 데이터를 읽을 수 없습니다. 만 트랜잭션이 후 데이터를 읽을 수있는 트랜잭션을 커밋합니다.

그러나 우리는 또한, 두 개의 읽기 단일 트랜잭션에서 트랜잭션의 결과가 일치하지 않는 위의 예에서 볼, 그래서 비 반복 읽기 해결할 수없는 현상을 읽기 읽기 제출합니다.

즉, 저자이 분리 레벨은 판독 데이터가 더티 판독 (더티 판독) 피 제출되도록 읽었다. 그러나 동일한 데이터를 읽을 수있을 때 트랜잭션이 때문에 단지 데이터를 읽을 데이터를 수정할 수 있습니다 서로 거래를 읽은 후, 다시 읽을 보장하지 않습니다.

반복 읽기 (반복 읽기)

반복 읽기 (REPEATABLE 읽기), 저자 읽기 분리 레벨이 반복 불가능한 읽기의 현상을 읽어야하기 때문에. 따라서, 읽기 최선을 다하고 격리 수준보다 더 높은 수준의 비 반복 읽기의 문제를 해결할 수 있습니다. 이 반복 읽기 분리 레벨이라고합니다.

데이터베이스는 반복 읽기의 경우 잠금

즉시 읽기 트랜잭션 데이터 (즉 독서를 시작하는 순간이다) 먼저 추가해야합니다 행 수준 공유 잠금을 때까지 트랜잭션의 끝이 해제되지 않습니다;

즉시 업데이트 트랜잭션 데이터 (즉, 순간 업데이트됩니다) 먼저 추가해야합니다 행 수준 배타적 잠금을 때까지 트랜잭션의 끝이 출시되었습니다.

현상

트랜잭션이 라인 레벨의 공유 잠금 경우를 증가하기 때문에 전체 프로세스의 트랜잭션 레코드의 행을 읽고, 트랜잭션이 (두 행에서 행을 읽을 수 트랜잭션이 공유 같은 데이터를 증가시킬 수있다 데이터를 읽을 잠급니다.).

트랜잭션 1이 전체 과정의 기록에 행이 트랜잭션이 트랜잭션이 잠금을 해제 할 커밋 될 때까지 전 과정을 1 개 증가는 데이터를 읽을 행이 개 데이터 (공유 잠금 업무를 수정할 수 없습니다 읽고, 그래서 전체 프로세스, 다른 트랜잭션 데이터 선 단독 잠금을 증가시킬 수있다. 그래서, 반복 판독 현상을 해결할 수 판독 반복 불가능한 읽기 )

거래 1 행의 기록을 갱신 할 때,이 트랜잭션이 행은 트랜잭션 1이 끝날 때까지, 읽기, 업데이트하지 않습니다. (트랜잭션 1은 트랜잭션 2가 제출되지 전에, 트랜잭션 데이터를 읽을 수있는 공유 데이터 잠금을 늘릴 수 없습니다, 은행의 데이터 행이 그를 잠금을 해제 할 트랜잭션의 끝을 알고 잠 증가, 시간에 데이터를 업데이트하므로. 따라서 독서는 더러운 읽기 현상을 제출 해결할 수 있습니다 )

예를 들면

트랜잭션 두 문제
/* Query 1 */ SELECT * FROM users WHERE id = 1; COMMIT;
/* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; COMMIT; /* in multiversion concurrency control, or lock-based READ COMMITTED */

위의 예에서, 단지 트랜잭션의 제출 후, 트랜잭션은 데이터의 두 개의 행을 변경할 수있다. 그래서만큼이 기간 동안 처음부터 트랜잭션 그가 라인 데이터를 여러 번 읽을 여부, 완료, 결과는 동일합니다.

위의 예에서 우리는 결론을 내릴 수있다 : 반복 읽기 분리 레벨이 반복 불가능한 읽기 읽기의 현상을 해결할 수 있습니다. 그러나이의 반복 읽기 분리 레벨은 팬텀 읽기 그의 결의를 읽을 수 없습니다 다른 현상이 있습니다. 아래의 예를 참조 :

트랜잭션 두 문제
/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30;
/* Query 2 */ INSERT INTO users VALUES ( 3, 'Bob', 27 ); COMMIT;
/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30;

상기 두 트랜잭션 다음과 같이 현상의 구현 :

1. 첫 번째 쿼리 트랜잭션이 age BETWEEN 10 AND 30;이 조건에 일치하는 다른 10 개 기록됩니다. 이 때, 그는 주 행 수준 잠금에서 이러한 열 명 자격을 기록 증가를 줄 것이다. 다른 트랜잭션이 10 개 기록을 변경할 수 없습니다.

2. 두 개의 트랜잭션이 SQL 문을 실행 명령문의 내용은 테이블에 행을 삽입한다. 이 때문에 시간에 업무에 테이블의 증가가없는 테이블 수준 잠금 작업이 원활하게 수행 될 수 있도록.

3. 거래를 다시 실행 SELECT * FROM users WHERE age BETWEEN 10 AND 30;트랜잭션이 두 개 삽입 증가 된 경우, 그 결과는 하나의 증가와 비교하여, 기록 열한로 리턴되며,이다.

따라서, 두 트랜잭션 쿼리 결과의 범위는 동일하지 않습니다. 이것은 우리가 언급 한 것입니다 팬텀 읽기 .

직렬화 (직렬화)

직렬화 (직렬화)은 격리 수준 팬텀의 가장 높은 격리 수준은 이전에 직렬화 격리 수준에서 해결할 수없는 언급이 해결 될 수 읽기입니다.

(: SELECT 질의를 A는 "WHERE"절은 범위 잠금을 설명합니다 사용 범위 잠금), 팬텀 발생하는 읽는 우리는 트랜잭션이 문의 잠금 범위의 범위를 증가하지 않을 때 팬텀 읽기의 원인이 수행하는 것이 말했다.

직렬화 데이터베이스 잠금 상황 (실현의 원칙)

트랜잭션 데이터는 먼저 추가해야합니다, 읽기 테이블 레벨의 공유 잠금을 때까지 트랜잭션의 끝이 해제되지 않습니다;

때 트랜잭션 업데이트 데이터, 당신은 추가해야합니다 테이블 수준 배타적 잠금을 때까지 트랜잭션의 끝이 출시되었습니다.

현상

테이블의 트랜잭션 기록 1 표 A에서 트랜잭션이 읽을 수 읽기되고 있지만, 트랜잭션이 완료 될 때까지 1의 테이블에 업데이트를 할 추가, 삭제할 수 없습니다. (트랜잭션이 테이블 테이블 레벨의 공유 잠금의 쌍을 추가하기 때문에, 다른 트랜잭션은 당신이 다른 작업을 수행 할 수없는 경우에도 데이터를 읽기 위해 공유 잠금을 높일 수 있습니다)

테이블의 트랜잭션 기록 1 트랜잭션은 기록 2 표, 업데이트을 추가, 트랜잭션이 완료 될 때까지 1을 삭제 덜 테이블을 읽을 수없는, 업데이트되고있다. (트랜잭션 테이블의 테이블 수준 배타적 잠금 한 쌍을 추가, 다른 트랜잭션이 공유 테이블 잠금 또는 배타적 잠금을 늘릴 수 없습니다, 어떤 작업을 수행 할 수 없습니다)

더티 판독을 해결하는 순서 등 비 반복 읽기 팬텀 읽고, 읽어 않는다. 그러나 거래의 순서는 다음과 같은 효과가있을 것이다 :

기록을 읽을 수 없습니다 1. 다른 트랜잭션에 의해 수정되었지만 제출하지되었습니다.

2. 전에 현재의 트랜잭션 (transaction)의 완료에, 다른 트랜잭션은 현재 레코드 트랜잭션이 읽기 수정할 수 없습니다.

현재의 트랜잭션 (transaction)의 완료 전에 3. 다른 기업은 인덱스 키 범위에서 인덱스 키 값으로 새 레코드를 삽입하는 것은 현재 읽기 트랜잭션의 모든 문이 아니다.


동시성에 더 낮은지고 또한 분리의 높은 수준을 받고 있지만에서 트랜잭션 격리 수준의 네 가지입니다. 그래서 몇 가지 격리 수준이있는 이유는, 개발자가 개발 과정에서 비즈니스를 기반으로 가장 적절한 격리 수준을 선택해야 촉진하는 것입니다.

추천

출처www.cnblogs.com/kyoner/p/11366805.html