MySQL의 성능 최적화 (3 개) - 트랜잭션 제어

1, 엔진의 이노 디비 정도는 격리 수준을 지원합니다

트랜잭션 격리 수준 더러운 읽기 비 반복 읽기 매직 읽기
확약 읽기 (미완료 읽기) 가능한 가능한 가능한
최선을 다하고 읽기 (읽기 최선을 다하고) 불가능한 가능한 가능한
반복 읽기 (읽기를 반복) 불가능한 불가능한 이노 디비에 불가능
직렬화 (직렬화) 불가능한 불가능한 불가능한

 

 

 

 

 

결국 분리 레벨은 어떻게 그것을 달성하기 위해? 잠금, MVCC

2 테이블이 이해 잠금 행 잠금

다른 업무를 관리하는 공유 리소스에 대한 동시 액세스를 위해 잠금

표 차분 자물쇠 및 행 잠금 :

잠금 입자 크기 : 테이블 잠금> 행 잠금

잠금 효율성 : 테이블 잠금> 행

충돌의 확률 표 잠금> 행

동시성 : 테이블 잠금 <행 잠금

이노 스토리지 엔진은 행 및 테이블 잠금 (대안 행 잠금)을 지원

3, MySQL의 InnoDB의 잠금 유형

공유 잠금 (행 잠금) : 공유 잠금

독점 잠금 (행 잠금) : 독점 잠금

공유 의도 잠금 잠금 (테이블 잠금) : 의도 공유 잠금

의도 잠금 배타적 잠금 (테이블 잠금) : 의도 독점 잠금

자기 잠금을 증가 : AUTO-INC 잠금을

A, 잠금 알고리즘을 행

레코드 잠금 레코드 잠금

갭 잠금 간격 잠금

프로 키 잠금 다음 키 잠금

B, 공유 잠금 (공유 잠금) VS 배타적 잠금 (독점 잠금)

공유 잠금 : 또한 읽기 잠금으로 알려진, 이름에서 알 수 있듯이, 공유 잠금이 동일한 데이터에 대한 여러 트랜잭션, 당신은 데이터에 액세스 할 수있는 잠금 장치와 공유 할 수 있지만 수정할 수 없습니다 읽을 수있다, S 잠금이라;

모드 잠금 해제 : 쉐어 MODE IN ID = 1 LOCK 사용자 선택 * / 롤백 커밋

독점 잠금 : 또한 쓰기 잠금 알려진이 같은 거래와 같은 다른 잠금 장치와 공존 할 수없는 배타적 잠금이 독점 잠금에게 데이터 라인을 획득 X 잠금이라고, 다른 트랜잭션은 더 이상 라인 (공유 잠금, 배타적 잠금)의 잠금을 획득 할 수 없습니다 단지 단독 잠금을 획득 한 트랜잭션이 읽고 데이터 행을 수정할 수 있습니다 (다른 트랜잭션 데이터는 스냅 샷에서 읽을 수 있습니다)

잠금 해제 방법을 잠금 :

/ 업데이트 / 삽입 기본 잠금 플러스 X 삭제

커밋 ... UPDATE에 대한 테이블 _ SELECT * FROM / 롤백

C, 결국 innodb- 행 잠금은 무엇을 할까?

이노 행 잠금은 인덱스 인덱스 항목의 잠금을 통해 달성된다.

만 인덱스 데이터 검색 조건을 통해, InnoDB는 단지 행 수준 잠금. 그렇지 않으면, InnoDB하지만 (모든 레코드 잠금 인덱스) 테이블 잠금을 사용

表 锁 : 잠금 테이블이 읽기 / 쓰기 XX;

D 의도 공유 잠금 잠금 (IS) 및 의도 배타 잠금 래치 (IX)

의도 공유 잠금 (IS)

트랜잭션 데이터의 공유 잠금 행에 합류 할 준비가되어 나타냅니다 먼저 앞에있는 테이블에 대한 잠금을 획득해야 잠금을 공유하는 데이터 라인이 서로 의도 공유 잠금과 호환됩니다

의도 배타 잠금 (IX)

그것은 트랜잭션 데이터, 즉 데이터 라인 플러스 먼저 잠금 IX 그 전에 테이블을 잠글 받아야합니다 행의 단독 잠금 행에 합류 할 준비가되어 나타냅니다 의도 배타적 잠금이 사이에 서로 호환

의도 잠금 (IX IS) 사용자의 개입없이 자동 운전 이노 데이터 전에 첨가

의미 :

이 경우 트랜잭션이 잠금 테이블을 갈 때, 당신은 당신이 신속하게 표를 반환 할 수 있습니다, 의도 잠금 장치가 있는지 여부를 판단 할 수는 테이블 잠금을 활성화 할 수 없습니다

전자, 자기 잠금 AUTO-INC 자물쇠로

을위한 특별한 테이블 수준에서의 추가 성장을 잠금

 

'innodb_autoinc_lock_mode'와 같은 변수를 보여;

1의 기본값은 커밋되지 않은 트랜잭션 ID의 지속적인 영구적 인 손실을 나타냅니다

F 로크 레코드 (기록) 및 로킹 갭 (간격) 및 임시 키 로크 (다음 키)

레코드 잠금 :

특정 인덱스 항목 잠금

잠금을 특히 고유성 (기본 키, 고유 키) 인덱스, 질의 및 질의에 따라 데이터를 검색하는 형상 데이터가 상기 잠금 래치 레코드 잠금와 함께 기록되어있는, 다음의 SQL 명령문이다 일치하는 경우 SQL은 수행 인덱스 항목

갭 잠금 :

데이터가 존재하지 않는 간격 잠금 (왼쪽 개방 우측 개방)

SQL 실행 인덱스에 따라 데이터를 검색 할 때, 데이터 쿼리 조건의 간격이 존재하지 않는 인덱스를 잠근 후 로크와 SQL 문 갭 잠금하고, 존재하지 않는 것이 (오른쪽 개방 개방)

다음 키 잠금 :

+ 기록 로킹 부 (좌우 개폐)

当sql执行按照索引进行数据的检索时,查询条件为范围查找(between and、<、>等)并有数 据命中则此时SQL语句加上的锁为Next-key locks,锁住索引的记录+区间(左开右闭)

g、临键锁(Next-key)

 

 

 

 

 为什么innodb选择临键锁Next-key作为行锁的默认算法?

 

 h、间隙锁(Gap)

 

 

 

 

Gap只在RR事务隔离级别存在

i、记录锁(Record)

 

 

 

 

4、利用锁怎么解决脏读

 

 

 

 

 使用排它锁

5、利用锁怎么解决不可重复读

 

 

 使用共享锁

6、利用锁怎么解决幻读

 

 

 

使用临键锁

7、死锁介绍

 多个并发事务(2个或者以上);

   每个事务都持有锁(或者是已经在等待锁);

   每个事务都需要再继续持有锁;

 事务之间产生加锁的循环等待,形成死锁。

死锁的避免

1)类似的业务逻辑以固定的顺序访问表和行。

2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。

3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概 率。

4)降低隔离级别,如果业务允许,将隔离级别调低也是较好的选择

5)为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添 加上锁(或者说是表锁)

8、MVCC

MVCC:

Multiversion concurrency control (多版本并发控制)

并发访问(读或写)数据库时,对正在事务内处理的数据做 多版本的管理。以达到用来避免写操作的堵塞,从而引发读操 作的并发问题。

추천

출처www.cnblogs.com/nangonghui/p/11454703.html