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)
i、记录锁(Record)
4、利用锁怎么解决脏读
使用排它锁
5、利用锁怎么解决不可重复读
使用共享锁
6、利用锁怎么解决幻读
使用临键锁
7、死锁介绍
多个并发事务(2个或者以上);
每个事务都持有锁(或者是已经在等待锁);
每个事务都需要再继续持有锁;
事务之间产生加锁的循环等待,形成死锁。
死锁的避免
1)类似的业务逻辑以固定的顺序访问表和行。
2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概 率。
4)降低隔离级别,如果业务允许,将隔离级别调低也是较好的选择
5)为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添 加上锁(或者说是表锁)
8、MVCC
MVCC:
Multiversion concurrency control (多版本并发控制)
并发访问(读或写)数据库时,对正在事务内处理的数据做 多版本的管理。以达到用来避免写操作的堵塞,从而引发读操 作的并发问题。