InnoDB 스토리지 엔진 - 잠금


잠금 데이터베이스에 대한 동시 액세스의 사용을 극대화하기 위해 주로 나타납니다, 우리는 또한 각 사용자가 일관된 방식으로 데이터를 읽고 수정할 수 있는지 확인해야합니다

1. 잠금 무엇입니까

테이블 데이터에 대한 공유 리소스 .InnoDB 스토리지 엔진 행 수준 잠금에 대한 동시 액세스를 관리하기위한 잠금 메커니즘. 데이터베이스 시스템은 데이터를 제공, 공유 자원에 대한 동시 액세스의 무결성과 일관성을 지원하기 위해 잠금을 사용합니다.

의 MyISAM 스토리지 엔진은 테이블 잠금, 좋은 읽기 성능을 사용하지만 성능은 더 삽입 동시 접속됩니다.

2 잠금 래치 与

잠금 두 가지 유형의 : 데이터베이스에 래치를 잠금 및 잠금 래치 잠금이 언급 될 수 있지만 시간은 잠금을 필요로하는 것은 매우 짧 래치 볼트 (Shuan) 락 (경량)라고합니다. 지속 시간 %의 경우, 응용 프로그램의 성능은 매우 가난합니다.

(읽기 쓰기 고정) 뮤텍스 (mutex에)로 분할 될 수 있으며,으로 rwlock 취득하고 래치 이노 스토리지 엔진이다. 설계의 목적은 동시 스레드 일반적 교착 검출의 핵심 자원의 작동 정확성을 정돈하기위한 것이다.

거래의 목적을 잠금, 데이터베이스 개체 (테이블, 페이지, 라인 등)을 고정하는 데 사용됩니다. 일반적으로 잠금은 트랜잭션이 다시 압연 또는 해제 후에 제출 된 개체, 교착 메커니즘이 있습니다.

잠금 래치 비교 :

자물쇠 걸쇠
사물 사무
보호 데이터베이스 내용 메모리 데이터 구조
지속 전체 거래 과정 중요한 자원
모드 행 잠금, 테이블 잠금, 의도 잠금 읽기 - 쓰기, 뮤텍스
교착 상태 교착 상태 감지 및 처리 만 보장이 순차적으로 응용 프로그램에서 교착 없다
에 존재 잠금 관리자의 해시 테이블 각 오브젝트 데이터 구조

3. 이노 스토리지 엔진 잠금

(1). 잠금 유형

이노 스토리지 엔진은 다음과 같은 두 개의 잠금 달성 :

  • 데이터의 행을 판독 할 수 공유 잠금 (S 잠금, 잠금 판독)
  • 배타적 잠금 (X 잠금, 쓰기 잠금) 업데이트에 대한 거래를 허용하거나 데이터의 행을 삭제

두 라인 잠금 위에있는

읽기 잠금 사이 읽기 잠금은 쓰기 잠금 잠금 장치와 호환되지, 호환됩니다.

I nnoDB 스토리지 엔진은 테이블 수준 잠금이 의도 잠금을 지원합니다 :

의도 잠금 충돌의 문제를 해결하고 공존 행이 생성 테이블 잠금 장치를 잠급니다.

행이 테이블에 거래 행입니다 잠겨되면, 테이블은 다른 트랜잭션 B는 전체 테이블을 잠그고 두 개의 잠금 의지의 충돌을 획득한다.

선 행 잠금에 추가 때, 잠금 처음 의도 잠금 (때문에 의도 테이블 잠금), 다음 잠금을 결정할 때 다음 테이블을 추가, 전체 테이블 플러스 의도 잠금을 제공합니다.

잠금 여기에 쓰기 잠금을 참조한다.

의도 잠금

  • 의도 공유 잠금 (IS 잠금), 트랜잭션은 공유 잠금의 몇 줄의 테이블을하고 싶어
  • 의도 배타 잠금 (IX 잠금), 테이블을 취득 할 거래 및 독점 잠금 몇 줄의

세 개의 테이블은 단순 모니터링 및 잠금 문제가있을 수 있습니다 현재의 트랜잭션 (transaction)의 분석을 할 수 있습니다 :

  • INNODB_TRX : 표시 현재 실행중인 트랜잭션 이노
  • INNODB_LOCKS : 디스플레이 케이스는 각 테이블을 잠글
  • INNODB_LOCK_WAITS : 표시 현재 대기 문제

 표 세부 정보는 두 번째 에디션 P255-257 내부의 MySQL의 InnoDB의 스토리지 엔진 기술 참조

(2) 비 일관성 로크 판독

잠금 해제 읽기 전에 순간의 스냅 샷 인 읽기

일관된 비 잠금은 현재 실행중인 데이터베이스 데이터에서 오픈 리딩 시간 널 행 멀티 라인 버전로서 이노 스토리지 엔진. (복수 버전이 스냅 샷을 판독)하는 것이 수단 읽기

데이터 라인의 이전 버전의 스냅 샷 데이터를 의미하는 것은 다 실행 취소 세그먼트 (롤백에 대한 노드 오래된 데이터 링크)입니다, 그래서 공간 오버 헤드가 없다.

일관된 비 잠금은 기본 모드를 읽을 InnoDB 스토리지 엔진을 읽을 수 있지만 다른 트랜잭션 격리 상황에서, (다른 정의 또는 스냅 샷 데이터) 변화가 발생할 수 있습니다 읽습니다.

커밋되지 않은 읽기 및 일관된 비 잠금 읽기를 사용하여 다음을 다시 읽기,하지만 항상 스냅 샷 데이터의 최신 읽기 확약 읽기, 반복 읽기 트랜잭션에서 읽을 수있는 데이터의 행 버전을 시작합니다.

기본적으로 다른 것을하기 전에, 당신이 제출을 읽을 수있는 데이터 롤백 데이터가 여기에 변경되지 않고 데이터베이스에있는 데이터의보다 페이지를 취소 말합니다.

(3) 잠금 일관성 읽기

현재 독서는 플러스 읽기 잠금

  • 선택 ... 업데이트 : 쓰기 잠금
  • ... 공유 모드 잠금을 선택합니다 읽기 잠금을 추가

(4) 잠금의 성장 이후

每一个自增长的插入:
开启事务 --> 获取自增长值 --> 重新设置自增长值 --> 插入相应数据 --> 提交事务
			    |________________________________|
								|
							  锁有效

성장 자체 증분 카운터에 의해 달성되기 때문에, 매번 삽입 동작을 포함하는 자동 증가 카운터 테이블의 카운터가 초기화되고, 테이블의 성장 컬럼의 최대 값은 다시 전류의 값을 설정하는 조회 쿼리를 통과 할 프로세스 잠금이 아니라 트랜잭션이 끝날 때까지 대기보다, select 문이 실행 된 후에 발표 될 예정 동안 테이블을 잠글 필요.

MySQL의 버전 5.1.22 후 효율하에 삽입 다량의 경우 이러한 패턴은 이노 스토리지 엔진은 자체 성장 메카니즘을 달성하는 경량 뮤텍스 (원자 변수)를 제공한다.

InnoDB 스토리지 엔진, 색인 열 값의 성장해야하며, 인덱스의 첫번째 열이어야하기 때문이다.

InnoDB 스토리지 엔진은 innodb_autoinc_lock_mode 성장 모델에서 제어 파라미터를 제공, 참조

MySQL의 innodb_autoinc_lock_mode 설정

(5) 외부 키 잠금

외부 키, InnoDB 스토리지 엔진은 자동으로 테이블 잠금을 방지하기 위해 인덱스를 추가합니다.

조인 쿼리의 경우, 부모 테이블은 읽기 잠금을 추가합니다.

4. 잠금 알고리즘

세 가지 알고리즘 (1) 라인 잠금

  • 기록 잠금 : 잠금 한 줄
  • 갭 자물쇠 잠금 갭 (광고 및 팬텀 삽입을 방지하기위한 선 사이의 간격은 데이터 판독 유도)
  • 다음 키 자물쇠 잠금 범위 (이 질의 행 잠금을 사용하는 이노 스토리지 엔진) 상기 두 개의 자물쇠의 조합

인덱스 쿼리가 고유의 속성을 포함하는 경우, InnoDB 스토리지 엔진은 다음 키 잠금, 감소 기록 잠금을 최적화합니다

보조 잠금 지수의 경우, 다음 키 잠금 후속 록에 기초하여 격차를 줄 것이다

5. 잠금 문제

  • 더러운 읽기
  • 비 반복 읽기
  • 분실 갱신

6. 교착 상태

교착 상태 문제는 특정의에서 찾을 수 있습니다 운영 체제 - 프로세스 관리

7. 잠금 에스컬레이션

  잠금 에스컬레이션 : 현재 잠금 단위의 감소를 의미

 스토리지 엔진 이노 디비, 더 잠금 에스컬레이션이 없습니다. 이는 사용 된 로크 관리 비트 맵 방식에 대한 트랜잭션의 각 페이지마다 액세스 할 수있어서, 이에 대하여 각 레코드에 따른 행 잠금을 발생하지 않기 때문에

发布了141 篇原创文章 · 获赞 47 · 访问量 4万+

추천

출처blog.csdn.net/qq_41596568/article/details/104332569