MySQL은 잠금 단위에 따라 행 잠금, 페이지 잠금, 테이블 잠금으로 나눌 수 있습니다.
Row lock
1. 행 잠금의 잠금 세분성은 MySQL에서 가장 우수합니다. 이는 InnoDB 스토리지 엔진에 적용되며 작업의 현재 행만 잠급니다. 동시성의 경우 잠금 대기 확률이 낮고 더 많은 동시성을 지원하지만 오버헤드가 높고 잠금이 느리며 교착 상태가 발생할 수 있습니다.
2. InnoDB에서 행 잠금을 사용하려면 전제 조건이 있습니다. 데이터를 검색할 때 인덱싱이 필요합니다! InnoDB는 인덱스의 인덱스 항목을 잠가서 행 잠금을 구현하기 때문입니다.
3. InnoDB는 인덱스 조건 없이 쿼리할 때 테이블 잠금을 사용하므로 동시성이 클 경우 많은 잠금 충돌이 발생할 수 있습니다. 또한, 인덱스에 대한 행 잠금이 잠기는 경우에는 서로 다른 레코드에 접근하더라도 동일한 인덱스 항목을 사용하더라도 잠금 충돌이 발생할 수 있습니다.
팁: 인덱스 검색을 사용하는 경우 행 잠금을 반드시 사용할 필요는 없으며 테이블 잠금도 사용할 수 있습니다. MySQL은 다양한 실행 계획의 비용을 비교하기 때문에 InnoDB는 전체 테이블 스캔이 인덱스보다 효율적일 때 테이블 잠금을 사용합니다. 따라서 SQL 실행 계획과 연계하여 잠금 충돌을 분석하는 것이 필요합니다.
4. 행 잠금에서는 교착 상태가 발생합니다. 행 잠금에서는 잠금이 점차적으로 획득되며 주로 기본 키 인덱스 잠금과 기본 키가 아닌 인덱스 잠금의 두 단계로 나뉩니다. 예를 들어, 두 개의 트랜잭션이 동시에 실행되면 하나는 기본 키 인덱스를 잠그고 다른 인덱스를 기다리고 있고, 다른 하나는 기본 키가 아닌 인덱스를 잠그고 기본 키 인덱스를 기다리고 있습니다. 교착 상태가 발생합니다. InnoDB는 일반적으로 이러한 종류의 교착 상태를 감지하고 한 트랜잭션이 잠금을 해제하고 롤백하도록 하고 다른 트랜잭션이 잠금을 획득하여 트랜잭션을 완료하도록 할 수 있습니다.
테이블 잠금
테이블 잠금의 잠금 세분성은 MySQL에서 가장 거칠며 InnoDB 및 MyISAM 엔진에 적용되며 현재 테이블 전체를 잠급니다. 동시성이 높은 시나리오에는 적합하지 않지만 오버헤드가 낮고 잠금이 빠르며 교착 상태가 없으며 잠금 충돌 가능성이 가장 높습니다.
페이지 잠금
페이지 잠금의 세분성은 행 잠금과 테이블 잠금 사이에 있습니다. BDB 엔진에 적용되며 동시성은 평균이며 비용과 잠금 속도도 행 잠금과 테이블 잠금 사이에 있습니다.
위 내용은 MySQL의 행 잠금, 페이지 잠금 및 테이블 잠금에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!