MySQL 환 독 및 어떻게 제거 하 는 지 자세히 알 아 보기

4311 단어 MySQL환독 하 다
이것 은 데이터베이스 격 리 단계 의 과학 보급 문장 으로 데이터베이스 에서 유명한 환 독 현상 을 이해 하기 위해 집중 하기 위해 더러 운 읽 기,중복 읽 기 불가 에 대해 토론 하지 않 는 다.
트 랜 잭 션 격 리 단계
MySQL 은 4 단계 트 랜 잭 션 격 리 단계 가 있 습 니 다.
읽 기 미 제출 READ-UNCOMMITTED:더러 운 읽 기,중복 읽 기,환 독 문제 가 있 습 니 다.
읽 기 이미 제출 된 READ-COMMITTED:더러 운 읽 기 는 존재 하지 않 지만 중복 읽 기 불가,환 독 문제 가 있 습 니 다.
반복 읽 기 가능 REPEATABLE-READ:더러 운 읽 기,중복 읽 기 문제 가 없 지만 환 독 문제 가 있 습 니 다.
직렬 화 SERIALIZABLE:더러 운 독 서 를 해결 하고 중복 읽 을 수 없 으 며 환 독 문 제 를 해결 하지만 완전히 직렬 로 실행 하여 성능 이 가장 낮 습 니 다.
환 독 이란 무엇 인가
환 독 오류 의 이해:환 독 은 사무 A 가 두 번 의 select 작업 을 수행 하여 서로 다른 데이터 세트 를 얻 는 것 이 라 고 말 합 니 다.즉,select 1 은 10 개의 기록 을 얻 고 select 2 는 11 개의 기록 을 얻 습 니 다.이것 은 사실 환 독 이 아 닙 니 다.이것 은 다시 읽 을 수 없 는 것 입 니 다.R-U R-C 단계 에서 만 나타 나 고 my sql 의 기본 RR 격 리 단계 에 서 는 나타 나 지 않 습 니 다.
여기 서 내 가 환 독 에 대한 이 해 를 제시한다.
환 독 은 사무 에서 여러 번 읽 고 얻 은 결과 집합 이 다르다 는 것 이 아니 라 환 독 이 더욱 중요 한 것 은 특정한 select 작업 에서 얻 은 결과 집합 이 표징 한 데이터 상태 가 후속 업무 작업 을 지탱 할 수 없다 는 것 이다.좀 더 구체 적 으로:select 기록 이 존재 하지 않 습 니 다.이 기록 을 삽입 하려 고 합 니 다.그러나 insert 를 실행 할 때 이 기록 이 존재 하고 삽입 할 수 없습니다.마치 환각 이 생 긴 것 같 습 니 다.
예 를 들 면 이 해 를 간소화 할 수 있다.

mysql> show create table user\G
*************************** 1. row ***************************
 Table: user
Create Table: CREATE TABLE `user` (
 `id` int(11) NOT NULL,
 `name` varchar(32) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
각각 두 개의 사무 T1&T2 를 열 고 격 리 단 계 를 Reaptable-Lead 로 설정 합 니 다.
T1:

mysql> set global transaction isolation level repeatable read;      
​
mysql> begin;
mysql> select * from user;
mysql> insert into user values (1, 'jeff');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
​
mysql> select * from user;
T2:

mysql> set global transaction isolation level repeatable read;      
​
mysql> begin;
mysql> insert into user values (1, 'jeff');
mysql> commit;
T1 트 랜 잭 션 검사 표 에 id 가 1 인 기록 이 있 는 지,없 으 면 삽입 합 니 다.
T2 간섭 기록 을 삽입 하여 T1 에 환 독 이 발생 합 니 다.
상례 에 서 는 T1 트 랜 잭 션 이 begin 을 실행 하도록 확보 한 후에 야 트 랜 잭 션 T2 를 시작 합 니 다.
상기 사례 에서 T1 은 환 독 이 발생 했다.T1 이 읽 은 데이터 상태 와 뒤의 동작 이 의미 적 으로 충돌 하기 때문이다.조회 할 때 분명히 알림 기록 이 존재 하지 않 고 삽입 할 때 메 인 키 가 중복 되 는 것 을 알려 주 며 환영 이 나타 나 는 것 과 유사 하기 때문에 환 독 이 라 고 부른다.
어떻게 환 독 을 없 앨 것 인가
MySQL 은 현재 두 가지 방법 으로 환 독 을 제거 할 수 있 습 니 다.
1.select 를 통 해 수 동 으로 X 자 물 쇠 를 추가 합 니 다(SELECT...FOR UPDATE).그 이 유 는 InnoDB 에서 잠 겨 있 기 때 문 입 니 다.
색인 입 니 다.현재 기록 이 존재 하지 않 더 라 도 현재 트 랜 잭 션 은 기록 잠 금 을 얻 을 수 있 습 니 다.
존재 하면 next-key lock 간극 X 잠 금)을 추가 합 니 다.그러면 다른 사 무 는 이 색인 의 기록 을 삽입 하여 판 타지 를 근절 할 수 없습니다.
읽다
2.격 리 단 계 를 SERIALIZABLE 로 승급
효과 테스트 해 볼 게 요.

mysql> begin;
​
mysql> select * from user where id = 2 for update;
mysql> insert into user values (2, 'tony');

mysql> commit;
T2:

mysql> begin;
​
mysql> insert into user values (2, 'jimmy');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
현재 T1 조회 시 for update 를 가지 고 있 습 니 다.Innodb 에 서 는 이 색인 에 자 물 쇠 를 추가 합 니 다(현재 존재 하지 않 더 라 도).그래서 T2 의 insert 는 T1 이 제출 할 때 까지 막 힙 니 다.그러면 T1 이 성 공 했 습 니 다.T1 에 있어 서 환 독 은 확실히 제거 되 었 지만 T2 의 삽입 은 메 인 키 를 다시 보 냅 니 다.이것 도 기대 에 부합 합 니 다.
또 다른 격 리 단 계 를 향상 시 켜 환 독 을 없 애 는 방식 에 관심 이 있 는 사람 은 스스로 시도 할 수 있다.여 기 는 중복 되 지 않 고 그 본질은 비슷 하 다.다만 시스템 이 수공 으로 자 물 쇠 를 채 우 는 것 을 대체 할 뿐이다.
총결산
RR 은 my sql 사무 기본 격 리 단계 로 서 사무 안전 과 성능 의 절충 이다.판 타지 독 서 를 정확하게 인식 한 후에 개발 자 는 수요 에 따라 판 타지 독 서 를 방지 해 야 하 는 지 여 부 를 스스로 결정 할 수 있다.
SERIALIZABLE 은 환상 적 인 읽 기 시간 이 모두 발생 하기 때문에 자동 적 으로 암시 적 으로 사무 소 를 잠 그 고 다른 사무 가 이 자원 을 방문 하 는 것 이 막 혀 기다 리 기 때문에 사 무 는 안전 하지만 성능 을 진지 하 게 고려 해 야 한다 고 비관 적 으로 생각 합 니 다.
InnoDB 의 자 물 쇠 는 색인 을 위 한 것 이라는 점 에서 주 의 를 끌 필요 가 있다.줄 기록 에 자 물 쇠 를 추가 합 니 다.존재 하면 X 자 물 쇠 를 추가 합 니 다.그렇지 않 으 면 next-key lock/gap 자물쇠/간극 자 물 쇠 를 추가 합 니 다.따라서 InnoDB 는 특정한 기록 에 대한 사전 점용 을 실현 할 수 있 습 니 다.본 업무 가 있 으 면 다른 사 무 는 그것 을 차지 하려 고 하지 마 십시오.자물쇠 에 관 해 서 는 뒤에 또 전문 적 인 문장 토론 이 있 을 것 이다.
이상 은 MySQL 의 환 독 과 어떻게 제거 하 는 지 에 대한 상세 한 내용 입 니 다.MySQL 의 환 독 과 제거 에 관 한 자 료 는 저희 의 다른 관련 글 에 관심 을 가 져 주 십시오!

좋은 웹페이지 즐겨찾기