MySQL 데이터베이스 격 리 단계 와 MVCC 에 대한 자세 한 설명

Mysql 은 우리 가 일상적인 생산 과 학습 에서 가장 자주 접 하 는 데이터베이스 중 하나 입 니 다.오늘 은 Mysql(또는 다른 유사 한 데이터베이스)에 존재 하 는 격 리 단계 와 효율 을 높이 는 다 중 버 전 병행 제어(MVCC)에 대해 말씀 드 리 겠 습 니 다.
격 리 단계
우선 우 리 는 사무 라 는 개념 을 언급 해 야 한다.무엇이 사무 입 니까?사 무 는 기초 작업 을 완성 하 는 일련의 조작 문장의 집합 이다.예 를 들 어 저 는 200 위안 을 계좌 A 에서 계좌 B 로 옮 기 려 고 합 니 다.그러면 제 가 진행 할 수 있 는 작업 은 다음 과 같 습 니 다.
a.계좌 A 중의 잔액 이 200 위안 보다 큰 지 검증 합 니 다.
b.계좌 A 의 잔액 을 200 위안 줄인다.
c.계좌 B 의 잔액 을 200 위안 추가 합 니 다.
우 리 는 위의 abc 세 가지 조작 을 하나의 업무 로 만 들 었 다.
이때 우 리 는 우리 가 말 하 는 한 가지 업무 가 여러 개의 문 구 를 조합 하여 이 루어 질 수 있 고 업무 에 원자 성 이 존재 한 다 는 것 을 알 게 될 것 이다.즉,업무 의 집행 과정 에서 중단 되 어 서 는 안 된다 는 것 이다.그러면 문 제 를 가 져 올 것 이다.만약 에 이 세 단계 의 집행 과정 에서 다른 문구 가 삽입 되 어 집행 하면 결과 에 영향 을 줄 수 있 는 지,이때 사무의 원자 성 을 파 괴 했 기 때문이다.이런 삽입 상황 은 병발 하 는 환경 에서 흔히 볼 수 있다.따라서 우리(또는 데이터베이스 엔진)는 하나의 업무 수행 과정 에서 이 를'보호'해 야 한다.즉,외부의 다른 업무 의 문구 가 실행 중인 사무 문구 에 임의로 삽입 되 어 업무 의 정상 적 인 집행 을 보장 하지 못 하도록 해 야 한다.이때 우 리 는 쉽게 자 물 쇠 를 채 우 는 방법 을 생각 할 것 이다.이것 은 사실 매우 추상 적 인 표현 이다.자 물 쇠 를 넣 으 면 업무 의 정상 적 인 집행 을 보장 할 수 있 지만 비교적 큰 추가 비용 을 가 져 올 수 있 기 때문에 적당 한 때 에 적당 한 자 물 쇠 를 넣 는 방식 을 선택 하 는 것 이 검색 효율 에 미 치 는 영향 이 매우 크다.그러나'자물쇠'가 엄격 하지 않 으 면 집중 적 으로 다른 격 리 단 계 를 제외 하고 구분한다.
읽 기 UNCOMMITED(읽 기 미 제출)
이런 격 리 경 계 는 데 이 터 를 읽 을 때 어떠한 영향 도 받 지 않 는 다.다른 사무 에 의 해 수정 되 고 있 는 데 이 터 를 읽 을 수도 있 고,읽 고 싶 으 면 읽 고,고치 고 싶 으 면 고 칠 수도 있다.이것 은 당연히 비용 이 매우 적 지만,예 를 들 어'더러 운 읽 기'와 같은 많은 문 제 를 가 져 올 것 이다.수정 중이지 만 제출 되 지 않 은 데 이 터 를 읽 으 면 데이터 읽 기 오류 가 발생 할 수 있 습 니 다.성능 상 READ UNCOMMITED 는 다른 등급 보다 많이 좋 지 는 않 지만,매우 많은 번 거 로 움 을 가 져 오기 때문에 이 즉시 피 를 실제 적 으로 사용 하 는 경 우 는 드물다.
READ COMMITED(읽 기/반복 불가)
이 단 계 는 READ UNCOMMITED 를 바탕 으로 일부 데이터 뱅 크 의 기본 격 리 단계 라 는 규정 을 추가 했다.읽 을 때 읽 은 데 이 터 는 제출 한 데이터 만 읽 을 수 있 도록 규정 한 READ UNCOMMITED 와 차이 가 있다.예 를 들 어 데이터 a 가 지난번 에 제출 한 후의 값 은 1 이다.이때 한 라인 이 들 어 와 서 a 를 수정 하고 a 를 2 로 수정 했다.그러나 이때 사무(COMMIT)를 제출 하지 않 았 다.이런 상황 에서 READ UNCOMMITED 단계 에서 읽 은 a 의 값 은 현재 의 2 이다.그러나 READ COMMITED 단계 에서 읽 은 것 은 지난번 에 제출 한 후의 값,즉 a 는 1 이다.스 레 드 를 수정 하여 a 의 값 을 2 로 바 꿔 야 합 니 다.이 사 무 를 제출 한 후에 읽 은 a 의 값 이 2 입 니 다.이 단계 가 가 져 온 문 제 는 중복 읽 을 수 없다 는 것 이다.즉,지난 시간 에 읽 은 a 의 값 은 1 이지 만 스 레 드 가 사 무 를 제출 하면 서 a 의 값 은 2 로 바 뀌 었 습 니 다.이때 읽 은 값 은 2 입 니 다.즉,같은 읽 기 동작 을 두 번 수행 하면 서 얻 은 값 은 다 릅 니 다.
더러 운 읽 기 와 더러 운 읽 기 를 반복 할 수 없 는 차이 점 은 더러 운 읽 기 는 하나의 업무 가 다른 미 완성 업무 수행 과정 에서 의 데 이 터 를 읽 는 것 이 고 중복 읽 을 수 없 는 것 은 하나의 업무 수행 과정 에서 다른 사무 가 현재 읽 고 있 는 데 이 터 를 제출 하고 수정 한 것 이다.
REPEATED READ(중복 읽 기 가능)
REPEATED READ 는 READ COMMITED 를 바탕 으로 제약 적 인 규칙 을 추 가 했 고 MySQL 데이터베이스 의 기본 격 리 단계 이기 도 합 니 다.쉽게 말 하면 한 업무 의 집행 기간 에 다른 업무 가 해당 하 는 데 이 터 를 수정 하 는 것 을 금지 하 는 것 이다.그러면 한 업무 의 집행 과정 에서 조회 한 데 이 터 는 반드시 일치 할 것 이다.즉,더러 운 읽 기와 다시 읽 을 수 없 는 문 제 를 해결 하지만 새로운 문 제 를 가 져 왔 다.즉,'환 독'이다.
'환 독'이란 한 업무 수행 과정 에서 해당 데이터 에 대한 수정 이 금지 되 었 지만 다른 업 무 는 데 이 터 를 삽입 할 수 있다 는 것 을 말한다.이때 첫 번 째 업 무 는'영문 도 모 르 고'데이터 가 더 나 와 마치 환각 을 일 으 킨 것 처럼 보인다.환 독 과 중복 읽 을 수 없 는 것 은 이미 제출 한 다른 사무(이 점 은 더러 운 읽 기와 다르다)를 읽 은 것 이다.서로 다른 것 은 중복 읽 을 수 없 는 조회 가 모두 같은 데이터 항목 이 고 환 독 은 데이터 전체(예 를 들 어 데이터 의 개수)를 대상 으로 한다.
SERIALIZABLE(직렬 화 가능)
이것 은 가장 엄격 한 격 리 단계 다.그것 은 강제 적 인 업무 직렬 집행 을 통 해 환 독 문 제 를 피 했다.그러나 이런 격 리 등급 의 비용 은 매우 커서 일반적으로 자주 사용 하지 않 는 다.
각종 격 리 단계 와 가능 한 문제 의 관 계 는 다음 과 같다.
격 리 단계
더 럽 게 읽다
반복 해서 읽 을 수 없다
환독 하 다
자 물 쇠 를 채우다
READ UNCOMMITED
YES
YES
YES
NO
READ COMMITED
NO
YES
YES
NO
REPEATED READ
NO
NO
YES
NO
SERIALIZABLE
NO
NO
NO
YES
MVCC
생각해 보면 매번 SQL 작업 이 데이터 의 일치 성과 정확성 을 확보 하기 위해 줄 잠 금 을 추가 해 야 한다 면 매우 믿 을 만하 지만 시스템 비용 과 검색 효율 의 하락 도 매우 뚜렷 하기 때문에 MVCC 는 이러한 모순 을 해결 하기 위해 생산 된 것 이다.
우선 MVCC 는 표 의 각 줄 기록 뒤에 숨겨 진 열 두 개,저장 줄 생 성 시간,저장 줄 의 만 료(삭제)시간 을 저장 합 니 다.이 시간 값 은 실제 시간 이 아니 라 시스템 버 전 번호 입 니 다.트 랜 잭 션 이 시 작 될 때의 시스템 버 전 번 호 는 트 랜 잭 션 의 버 전 번호 로 조회 한 줄 마다 기 록 된 버 전 번호 와 비교 합 니 다.
  • INSERT:새로 삽 입 된 줄 마다 현재 시스템 버 전 번 호 를 줄 버 전 번호 로 저장 합 니 다
  • DELETE:삭 제 된 줄 마다 현재 시스템 버 전 번 호 를 저장 하기 위해 가장 줄 에서 버 전 번 호 를 삭제 합 니 다
  • UPDATE:업 데 이 트 는 새로운 데 이 터 를 삽입 하고 원래 데 이 터 를 삭제 하 는 과정 으로 이해 해 야 합 니 다.즉,새로 삽 입 된 데 이 터 를 위해 현재 시스템 버 전 번 호 를 줄 버 전 번호 로 저장 하고 삭 제 된 데 이 터 를 위해 현재 시스템 버 전 번 호 를 삭제 버 전 번호 로 저장 하 는 것 입 니 다
  • SELECT:다음 조건 을 만족 시 키 는 줄 만 조회 합 니 다a.줄 버 전 번 호 는 트 랜 잭 션 버 전 번호 보다 작 습 니 다.
    b.버 전 번호 가 정의 되 지 않 거나 트 랜 잭 션 버 전 번호 이상 삭제
    이 두 버 전 번 호 를 저장 한 후에 절대 다수의 조작 은 잠 금 을 넣 지 않 은 상태 에서 정확 한 조작 을 하여 성능 과 효율 을 확보 할 수 있다.
    주의해 야 할 것 은 MVCC 는 READ COMMITED 와 REPEATABLE READ 두 격 리 단계 에서 만 일한다.
    이상 은 MySQL 데이터베이스 격 리 단계 와 MVCC 의 상세 한 내용 을 상세 하 게 설명 하 는 것 입 니 다.MySQL 데이터베이스 격 리 단계 와 MVCC 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기