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