MySQL의 원칙 장
RR에와 RC MySQL의 InnoDB의 차이는 무엇 읽기 스냅 샷입니다
동시성 제어
왜 통제를 병행 것인가?
중요한 자원에 대한 운영의 작업과 동시, 아무런 조치가 취해지지 않은 경우, 그것은 동시성 제어 (동시성 제어)이어야 불일치가 발생할 수 있습니다.
기술적으로, 일반적으로 어떻게 동시성 제어?
동시성 제어 수단으로 공통의 데이터 일관성을 보장한다 :
- 锁 (잠금)
- 다중 데이터 버전 (멀티 버전)
잠금
어떻게 일반 잠금 일관성을 보장 사용 하는가?
- 동작 데이터는, 고정 전에, 상호 배타적 인 실시 예에서, 동작은 다른 동시 작업을 허용하지 않고;
- 작업이 완료되면, 로크는 다른 작업을 수행 할 수 있도록 해제된다;
이러한 및 일관성을 보장합니다.
일반 잠금 문제는 무엇인가?
너무 거친 간단한 잠금 장치, 심지어는 "읽기 작업이"병렬 수 없습니다, 작업 실행은 자연 시리얼입니다.
그래서 공유 잠금 및 독점 잠금이 있습니다 :
- 데이터가 판독 로크 첨가되는 S (S 잠그는 잠금 공유) 공유 잠금
- 배타적 로크 (배타적 X 잠금이라고 잠금) 플러스 데이터 X를 변경 로크
공유 잠금 및 독점 잠금이 재생됩니다 :
- 공유 잠금은 상호 배타적으로 축약하지 않습니다 : 병렬로 읽기
- 병렬로 쓰기, 읽기, 쓰기하지 : 독점 잠금 약칭 어떤 로크의 배타적
우리는 작업이 데이터를 작성 완료되지되면, 데이터 동시성의 정도에 더 큰 영향을 줄 다른 작업에 의해 읽을 수없는 것을 볼 수 있습니다.
그것은 더 동시성에게 그것을 개선 할 수 있습니까?
심지어 완료되지 않은 작업을 쓰기 작업이 다른 읽기, 데이터의 여러 버전을 리드 복잡 할 수있다.
데이터의 여러 버전
동시성 데이터는 상기 방법을 개선 할 수있는 다중 버전, 핵심 원리는 :
- 쓰기 작업이 발생하면, 버전 번호의 데이터 복제 사본을 구별;
- 제출 때까지, 새로운 복제에 대한 데이터를 조작 쓰기 태스킹;
- 동시 읽기 작업은 데이터의 이전 버전을 읽을 계속 할 수 있고, 방해하지 않을 것이다;
그림으로 :
- 데이터의 시작 버전은 V0이다;
- T1 시간은 데이터 복제, 편집이 버전은 V1이되고있는 쓰기 작업을 시작하지만 작업이 완료되지 않은;
- 판독 작업과 T2 시간 동시, 당신은 여전히 데이터의 V0 버전을 읽을 수 있습니다;
- T3의 순간 판독 작업에 의해 복잡, 여전히 차단하지 않습니다;
그것은 "데이터의 이전 버전을 읽기"크게 향상시킬 수있는 동시 작업을 통해 데이터의 여러 버전을 볼 수 있습니다.
경우에 아이디어의 동시 발전을 향상 :
- 통상의 잠금은 기본적으로 일련의 실행이며
- 읽기 - 쓰기 잠금, 당신은 동시 읽기를 얻을 수 있습니다
- 데이터의 여러 버전, 당신은 동시 읽기 및 쓰기를 얻을 수 있습니다
글쎄, 그것을 재생하는 방법을 구체적으로 이노에 해당?
redo, undo, 시간 滚段
전에 더 InnoDB의 사용 방법을 설명 동시성이 크게 작업을 개선 "데이터의 이전 버전을 읽기", 다음 리두 로그, 취소 로깅, 롤백 (도입 할 필요가 롤백 세그먼트).
왜 로그를 다시 실행해야합니까?
데이터베이스 트랜잭션이 커밋 된 후, 업데이트 된 데이터는 ACID 속성을 보장하기 위해, 디스크에 닦았해야합니다. 모든 브러시 판은 크게 데이터베이스의 처리량에 영향을 미칠 경우 디스크 임의 쓰기 성능은 낮습니다.
최적화 방법은 리두 로그에 대한 첫 번째 기록의 동작 (순차적 쓰기에이 시간)을 수정 한 다음 정기적으로 디스크에 데이터를 솔질하는 것입니다, 이것은 성능을 크게 향상시킬 수 있습니다.
여기 아키텍처 설계 방식은 순차적 인 쓰기에 최적화 된 임의 쓰기는 아이디어가 더 중요하다는 것이다.
어떤 시점에서, 데이터베이스가 충돌하는 경우, 데이터베이스의 브러쉬 디스크 데이터에 충분한 시간은 트랜잭션이 디스크에 브러시에 의해 생성 된 데이터에 미치는 영향에 제출되었는지 확인하기 위해, 내용에 리두 로그를 재실행, 다시 시작됩니다.
워드는 리두 로그는 커밋 된 트랜잭션의 ACID 속성을 보호하는 데 사용됩니다.
왜 로그를 취소해야합니까?
데이터베이스 커밋되지 않은 트랜잭션이 트랜잭션이 수정 된 데이터를 미러링 할 때 (즉, 개정 전에 이전 버전) 벤 붕괴 또는 데이터베이스, 당신은 로그인 취소 할 수 있습니다 때 트랜잭션이 롤백 실행 취소 로그에 저장된 데이터의 이전 버전, 취소 데이터베이스에 대한 트랜잭션의 영향은 커밋 생성.
- 삽입 작업을 위해, 기록 새로운 데이터 PK (ROW_ID), 삭제 롤백 로그 취소;
- 삭제 / 업데이트 작업의 경우, 이전 데이터 행, 직접 롤백 복구를 기록 취소;
- 그들은 다른 버퍼 내부에 보관 하였다.
말씀은, 로그가 ACID 속성 데이터베이스에 영향을주지 않습니다 트랜잭션을 커밋하지 않도록 보호하는 데 사용됩니다 취소.
롤백은 무엇인가?
실행 취소 로그를 저장하는 장소는 롤백입니다.
MVCC 취소 로그와 롤백 세그먼트와 InnoDB는 밀접하게 펼쳐 설명하기 위해 예를 들어이, 관련이 있습니다.
表 : t (PK ID, 이름);
데이터 :
1 shenjian
2, zhangsan
3, 용해
이 시점에서이 커밋되지 않은 트랜잭션이 없으므로 롤백이 비어 있습니다.
그런 다음 트랜잭션을 시작합니다 :
TRX 시작; 삭제 ( 1 , shenjian); 업데이트 세트 ( 3 , 리시) 에 ( 3 , XXX); 삽입 ( 4 , wangwu);
당신은 볼 수 있습니다 :
- 전 (1, shenjian) 롤백에의 데이터의 이전 버전으로 삭제됩니다;
- 롤백에의 데이터의 이전 버전 (3, 리시) 변형 전에;
- 데이터 롤백에, (4) PK를 삽입하는 단계;
다음, 트랜잭션 ROLLBACK 경우 ,이 시간은 실행 취소 로그 롤 롤백에 의해, 수 있습니다 트랜잭션 커밋을 가정 , 실행 취소 로그에 롤백 세그먼트는 삭제할 수 있습니다.
당신은 볼 수 있습니다 :
- 삭제 된 데이터를 복원;
- 또한 복구 이전 데이터를 수정;
- 데이터 삭제, 삽입하는 단계;
트랜잭션 롤백은 모두 이전과 성공이다.
이노 스토리지 엔진은 다중 버전 동시성 제어에 기초
MVCC는 동시 트랜잭션에 의해 감소 잠금 충돌 "데이터의 이전 버전을 읽기", 동시성 작업을 개선하는 것입니다.
핵심 문제 :
- 데이터의 이전 버전은 저장?
- MySQL과 InnoDB의 원래 구조에 큰 영향이 있는지 여부, 데이터의 이전 버전을 저장?
방법의 실행 취소하고 위의 롤백 로그를 포장하여,이 두 가지 문제는 아주 좋은 답변입니다 :
- 이전 버전의 데이터가 롤백에 저장된다;
- 시스템의 MySQL과 InnoDB의 원래 아키텍처는 거의 영향을 미치지;
InnoDB의 커널은 모든 행 데이터는 3 개 개의 내부 속성을 증가시킬 것이다 :
- DB_TRX_ID, 6 바이트, 각 레코드 변화의 트랜잭션 ID의 마지막 줄;
- DB_ROLL_PTR, 7 바이트, 로그 포인터 롤백 취소 기록하는 단계;
- DB_ROW_ID 6 바이트 단조 광고 ID를 증가시키는 단계;
이러한 높은 동시성을 할 이유는 InnoDB의 수?
데이터의 롤백 세그먼트는 사실, 이러한 데이터는 아무것도 동시 그들을 읽고 할 수있는 선택, 수정되지 않습니다 기록 데이터 (스냅 샷)의 스냅 샷입니다.
스냅 샷 (읽기 스냅 샷)를 읽어 ,이 일관성는 잠금 해제 읽기 (일관된 Nonlocking 읽기), 그것은 동시에 매우 높은 이노의 핵심 이유 중 하나입니다.
일관성이 여기 하나 기존의 데이터에 대한 트랜잭션이 시작되기 전에, 데이터를 읽을 수있는 거래이며, 거래 그 자체에 삽입 또는 데이터를 수정 (물론, 생성 된 또 다른 커밋 된 트랜잭션입니다).
읽어 무엇의 스냅 샷을 선택?
쇼 잠금하지 않는 한, 선택 문장의 일반 스냅 샷은 예를 들어, 읽기 :
선택 * 에서 t 여기서 ID > 2 ;
여기에 표시 잠금, 스냅 샷이 아닌 읽기를 말합니다 :
선택 * 에서 t 어디 ID > 2 잠금 에서 공유 모드; 선택 * 에서 t 여기서 ID > (2) 에 대한 업데이트 ;
개요
- 일반적인 동시성 제어 방법은 데이터 일관성 잠금, 데이터의 여러 버전을 보장하기 위해;
- 일반 로크 직렬, 병렬 판독 기입 로크는 멀티 버전은 데이터를 병렬로 판독 및 기입;
- 커밋 된 트랜잭션 ACID 속성을 보장하기 위해 로그를 다시 실행, 설계 아이디어는 임의 쓰기, 대체에 의한 순차 쓰기 증가 동시성이다;
- 취소가 롤백에 저장되어 롤백되지 않은 트랜잭션에 로그인;
- MVCC는 용도 취소 로그 데이터의 이전 버전이 동시에 개선하는 것이에서 롤백에 저장된 이노 스토리지 엔진에 기반한다;
- 높은 동시 InnoDB하지만, 읽기 스냅 샷 잠금이 해제 이유;
- InnoDB는 모든 일반적인 스냅 샷 읽기를 선택이다;
이 논문의 지식은 MySQL5.6을 기반으로합니다.