Innodb는 두 개의 행 수준 잠금을 구현합니다. 하나는 공유 잠금이고 다른 하나는 배타적 잠금입니다.
실례합니다:
(1) 행 수준 잠금은 행 레코드에만 로드할 수 있나요? 공유 잠금과 배타적 잠금을 테이블 수준에서도 사용할 수 있다는 언급이 나타나는 이유는 무엇입니까?
팁 좀 주실 수 있나요
PHP中文网2017-05-17 10:07:00
InnoDB의 행 잠금은 잠금 문(즉, FOR UPDATE 및 LOCK IN SHARE MODE)이 인덱스를 사용할 때만 유효합니다. InnoDB는 실제로 인덱스를 기반으로 행을 잠그기 때문입니다. 즉, 인덱스를 사용하지 않으면 잠금이 자동으로 테이블 수준으로 올라갑니다.
PHP中文网2017-05-17 10:07:00
위에서 언급했듯이 트랜잭션 격리 수준이 반복 읽기(mysql 기본 수준)인 경우
InnoDB 엔진이 데이터를 수정하고 삭제할 때 먼저 해당 인덱스를 찾아 정렬합니다. 특정 값이나 범위가 잠깁니다.
이 범위가 전체 인덱스 세그먼트인 경우 전체 테이블 데이터가 잠깁니다. 또한 인덱스가 없으면 수정 및 삭제 작업 중에 전체 테이블이 스캔되고 전체 테이블은 자연스럽게 잠깁니다. 잠겼습니다.
迷茫2017-05-17 10:07:00
InnoDB는 다음 두 가지 유형의 행 잠금을 구현합니다.
공유 잠금: 하나의 트랜잭션이 행을 읽을 수 있도록 허용하고 다른 트랜잭션이 동일한 데이터 세트에 대해 배타적 잠금을 획득하는 것을 방지합니다.
배타적 잠금(X): 배타적 잠금을 획득한 트랜잭션이 데이터를 업데이트하도록 허용하고 다른 트랜잭션이 동일한 데이터 세트에 대해 공유 읽기 잠금 및 배타적 쓰기 잠금을 획득하지 못하도록 합니다.
또한, 행 잠금과 테이블 잠금이 공존할 수 있도록 하고 다중 입도 잠금 메커니즘을 구현하기 위해 InnoDB에는 내부적으로 사용되는 두 개의 의도 잠금(Intention Lock)도 있는데, 둘 다 테이블 잠금입니다.
IS(의도 공유 잠금): 트랜잭션은 데이터 행에 대한 잠금을 공유하려고 합니다. 트랜잭션은 데이터 행에 공유 잠금을 추가하기 전에 먼저 테이블의 IS 잠금을 획득해야 합니다.
의도 배타적 잠금(IX): 트랜잭션은 데이터 행에 배타적 잠금을 추가하려고 합니다. 트랜잭션은 데이터 행에 배타적 잠금을 추가하기 전에 먼저 테이블의 IX 잠금을 획득해야 합니다.
행 잠금은 행에 추가되는 반면 테이블 잠금은 전체 테이블에 해당합니다. 행 잠금과 테이블 잠금은 공존할 수 있습니다!