MySQL InnoDB 가 사무 특성 을 어떻게 보장 하 는 지 에 대한 예시 상세 설명
만약 누군가가 당신 에 게"데이터베이스 사무 에는 어떤 특성 이 있 습 니까?"라 고 묻는다 면?당신 은 곧 원자 성,일치 성,격 리 성,지속 성 즉 ACID 특성 에 대답 할 수 있 습 니 다.그럼 이 노 DB 가 이런 업무 특성 을 어떻게 보장 하 는 지 아 세 요?이 글 을 알 면 그냥 넘 어가 볼 수 있 습 니 다(\#^.^\#)
먼저 결론 을 말 하 다.
다시 만 들 기 로그 redo log 는 두 부분 으로 나 뉜 다.일 부 는 메모리 에 있 는 다시 만 들 기 로그 버퍼(redo log buffer)로 잃 어 버 리 기 쉽다.두 부분 은 로그 파일(redo log file)을 다시 만 드 는 것 으로 오래 간다.InnoDB 는 Force Log at Commit 메커니즘 을 통 해 지속 성 을 실현 합 니 다.commt 에 서 는 로그 파일 을 다시 만 들 때 까지 모든 로 그 를 기록 해 야 합 니 다.commt 작업 이 완료 되 어야 완 료 됩 니 다.
InnoDB 는 로그 버퍼 를 다시 만 드 는 내용 을 다음 과 같이 기록 합 니 다.
fsync 의 효율 은 디스크 의 성능 에 달 려 있 기 때문에 디스크 의 성능 은 트 랜 잭 션 제출 의 성능,즉 데이터 뱅 크 의 성능 을 결정 합 니 다.그래서 만약 에 누군가가 Mysql 데이터 베 이 스 를 최적화 하 는 방법 을 물 었 을 때 하드웨어 라 는 것 을 잊 지 말고 하 드 디스크 설정 을 향상 시 키 고 SSD 고체 하 드 디스크 로 바 꾸 도록 하 세 요.
로 그 를 다시 만 드 는 것 은 512 바이트 로 저 장 됩 니 다.다시 만 드 는 로그 블록 이 라 고 합 니 다.디스크 섹 터 크기 와 일치 합 니 다.로 그 를 다시 만 드 는 기록 은 원자 성 을 확보 할 수 있 고 doublewrite 기술 이 필요 하지 않 습 니 다.그것 은 다음 과 같은 세 가지 특성 이 있다.
업무 의 원자 성 을 만족 시 키 기 위해 서 는 모든 데 이 터 를 조작 하기 전에 데 이 터 를 한 곳 에 백업 한 다음 에 데 이 터 를 수정 합 니 다.오류 가 발생 했 거나 사용자 가 ROLLBACK 문 구 를 실 행 했 을 경우 시스템 은 Undo Log 의 백업 을 이용 하여 데 이 터 를 업무 시작 전 상태 로 복원 할 수 있 습 니 다.
undo log 는 다 중 버 전 병행 제어(MVCC)를 실현 하여 업무 의 격 리 성 을 보조 합 니 다.
스크롤 로 그 는 로 그 를 다시 만 드 는 것 과 다 릅 니 다.논리 로그 입 니 다.데이터 베 이 스 를 수정 하 는 것 은 모두 논리 적 으로 취소 되 었 습 니 다.일이 다시 굴 러 갈 때,그것 은 실제로 이전 과 반대 되 는 일 을 하 는 것 이다.모든 INSERT 에 대해 InnoDB 메모리 엔진 은 하나의 DELETE 를 완성 합 니 다.모든 UPDATE 에 대해 InnoDB 메모리 엔진 은 상 반 된 UPDATE 를 실행 합 니 다.
트 랜 잭 션 을 제출 한 후 바로 undo log 를 삭제 할 수 없습니다.이 는 undo log 를 통 해 이전 버 전 을 기록 해 야 할 다른 트 랜 잭 션 이 있 을 수 있 기 때 문 입 니 다.따라서 트 랜 잭 션 을 제출 할 때 undo log 를 하나의 링크 에 넣 고 undo log 를 삭제 할 수 있 습 니까?작업 에 따라 다음 과 같은 2 가지 상황 으로 나 눌 수 있 습 니까?
사무의 격 리 성의 실현 원 리 는 바로 자물쇠 이기 때문에 격 리 성도 병발 제어,자물쇠 등 이 라 고 할 수 있다.트 랜 잭 션 의 격 리 성 은 모든 읽 기와 쓰기 대상 이 다른 트 랜 잭 션 의 작업 대상 을 서로 분리 할 수 있 도록 요구한다.또한,예 를 들 어 버퍼 에 있 는 LRU 목록 을 조작 하고 삭제 하 며 LRU 목록 에 있 는 요 소 를 추가,이동 하 며 일치 성 을 확보 하기 위해 잠 금 의 개입 을 해 야 합 니 다.
자물쇠 의 종류
InnoDB 는 주로 2 가지 자물쇠 가 있 습 니 다.줄 자물쇠,의향 자물쇠 입 니 다.
줄 잠 금:
의향 잠 금:
The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.
의향 잠 금 의 주요 용 도 는 특정한 업무 가 한 줄 을 잠 그 거나 한 줄 의 데 이 터 를 잠 그 는 것 을 표현 하기 위 한 것 이다.e.g:사무 A 가 한 줄 의 기록 r 에 X 자 물 쇠 를 채 우려 면 InnoDB 는 신청서 의 IX 자 물 쇠 를 먼저 채 우 고 기록 r 의 X 자 물 쇠 를 잠 글 것 입 니 다.트 랜 잭 션 A 가 완료 되 기 전에 트 랜 잭 션 B 는 전체 표 작업 을 하려 고 합 니 다.이때 표 단계 의 IX 에서 트 랜 잭 션 B 에 게 표 에서 모든 줄 에 자물쇠 가 있 는 지 판단 하지 않 고 기 다 려 야 한다 고 알려 줍 니 다.의향 배열 자물쇠 의 존재 가 치 는 InnoDB 가 자물쇠 에 대한 포 지 셔 닝 과 처리 성능 을 절약 하 는 데 있다.또한 전체 표 스 캔 을 제외 하고 의향 자 물 쇠 는 막 히 지 않 음 을 주의 하 세 요.
잠 금 알고리즘
InnoDB 는 세 가지 줄 잠 금 알고리즘 이 있 습 니 다.
유일한 색인 으로 가면 다음-Key Lock 은 범위 가 아 닌 색인 자체 만 잠 그 는 Record Lock 으로 강 등 됩 니 다.즉,Next-Key Lock 의 사전 조건 은 트 랜 잭 션 격 리 단계 가 RR 이 고 조회 한 색인 이 유일한 색인,홈 키 색인 이 아 닌 것 이다.
다음은 예 를 들 어 자세히 말씀 드 리 겠 습 니 다.
먼저 표를 만 듭 니 다.
CREATE TABLE T (id int ,f_id int,PRIMARY KEY (id), KEY(f_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into T SELECT 1,1;
insert into T SELECT 3,1;
insert into T SELECT 5,3;
insert into T SELECT 7,6;
insert into T SELECT 10,8;
사무 A 는 다음 문장 을 실행 합 니 다:
SELECT * FROM T WHERE f_id = 3 FOR UPDATE
이 때 SQL 문 구 는 유일한 색인 이 아니 므 로 Next-Key Locking 을 사용 하여 자 물 쇠 를 추가 하고 2 개의 색인 이 있 으 며 각각 잠 금 이 필요 합 니 다.집합 색인 에 대해 서 는 id 가 5 와 같은 색인 에 Record Lock 만 추가 합 니 다.반면 보조 색인 에 대해 서 는 다음-Key Lock 을 더 해 범위(1,3)를 잠 그 고 있 으 며,특히 이 노 DB 저장 엔진 은 보조 색인 다음 키 에 갭 Lock,즉 범위(3.6)의 자 물 쇠 를 더 할 수 있다 는 점 에 주목 해 야 한다.
그래서 새 session 에서 다음 문 구 를 실행 하면
[Err] 1205 - Lock wait timeout exceeded; try restarting transaction
을 잘못 보고 할 수 있 습 니 다.
select * from T where id = 5 lock in share MODE -- , A id=5 X ,
INSERT INTO T SELECT 4,2 -- , 2, (1,3) ,
INSERT INTO T SELECT 6,5 -- ,gap (3,6) ,
이때 상상 해 보 세 요.사무 A 가 f 를 잠 갔 어 요.id=5 의 기록,정상적으로 gap lock,잠 금(5,6)이 있 습 니 다.그러면(5,6)의 gap 자물쇠 가 없 으 면 사용 자 는 색인 f 를 삽입 할 수 있 습 니 다.id 가 5 인 기록 은 사무 A 가 다시 조회 하면 서로 다른 기록 을 되 돌려 주 고 환 독 의 발생 을 초래 합 니 다.마찬가지 로 만약 에 우리 업무 A 가
select * from T where f_id = 10 FOR UPDATE
을 집행 하면 표 에서 데 이 터 를 찾 을 수 없 지만 Next-Key Lock 을 바탕 으로 잠 길 것 이다(8,+표시).우 리 는 INSERT INTO T SELECT 6,11
을 집행 하면 성공 적 으로 삽입 할 수 없 기 때문에 근본적으로 환 독 문 제 를 해결 했다.총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.