잠금은 컴퓨터가 여러 프로세스 또는 스레드의 리소스에 대한 동시 액세스를 조정하는 메커니즘입니다. 데이터베이스에서 데이터는 많은 사용자가 공유하는 리소스이기도 합니다. 데이터 액세스의 일관성과 효율성을 보장하는 방법은 모든 데이터베이스의 문제입니다. 잠금 충돌은 데이터베이스에 대한 동시 액세스 성능에 영향을 미치는 중요한 요소이기도 합니다. 이러한 관점에서 잠금은 데이터베이스에 특히 중요하고 복잡합니다.
MySQL 잠금 개요
다른 데이터베이스에 비해 MySQL의 잠금 메커니즘은 상대적으로 간단합니다. 가장 중요한 특징은 다양한 스토리지 엔진이 다양한 잠금 메커니즘을 지원한다는 것입니다. 예를 들어 MyISAM 및 MEMORY 스토리지 엔진은 테이블 수준 잠금(테이블 수준 잠금)을 사용하고 BDB 스토리지 엔진은 페이지 수준 잠금(페이지 수준 잠금)을 사용하지만 테이블 수준 잠금도 지원하지만 기본적으로 행을 사용합니다. -레벨 잠금.
시스템의 테이블 잠금 경합은 table_locks_waited 및 table_locks_immediate 상태 변수를 확인하여 분석할 수 있습니다.
show status like 'table%';
결과는 Table_locks_waited A입니다. 상대적으로 높은 값은 심각한 테이블 수준 잠금 경합이 있음을 나타냅니다.
MySQL의 세 가지 잠금 특성:
오버헤드, 잠금 속도, 교착 상태, 세분성, 동시성 성능
테이블 수준 잠금: 낮은 오버헤드, 빠른 잠금, 교착 상태 없음 발생하며 잠금 세분성은 크고 충돌 가능성은 가장 높으며 동시성은 가장 낮습니다
행 수준 잠금: 오버헤드가 높고 잠금이 느림, 교착 상태가 발생하고 잠금 세분성이 작습니다. , 잠금 충돌이 발생합니다.
페이지 잠금: 비용은 처음 두 개 사이에 있고 교착 상태가 발생하며 잠금 세분성은 처음 두 개 사이에 있으며 동시성은 평균입니다. 🎜>
잠금 관점에서만 볼 때: 테이블 수준 잠금은 주로 쿼리 기반이고 웹 애플리케이션과 같이 인덱스 조건에 따라 소량의 데이터만 업데이트하는 애플리케이션에 더 적합하지만 행 수준 잠금은 그렇지 않습니다. 인덱스 조건과 소수의 서로 다른 데이터를 기반으로 동시 업데이트가 많은 애플리케이션과 일부 온라인 트랜잭션 처리(OLTP) 시스템과 같이 동시 쿼리만 있는 애플리케이션에 더 적합합니다.
MySQL 테이블 수준 잠금에는 테이블 공유 읽기 잠금(Table Read Lock)과 테이블 배타적 쓰기 잠금(Table Write Lock)의 두 가지 모드가 있습니다.
테이블 잠금
1. 공유 읽기 잠금 추가
테이블 이름 읽기 잠금
테이블 잠금 해제 ;
3. 테이블 독점 쓰기 잠금
테이블 이름 쓰기 잠금;
참고:
MyISAM 테이블의 읽기 작업은 다른 테이블을 차단하지 않습니다. 동일한 테이블에 대한 사용자의 읽기 요청은 동일한 테이블에 대한 요청을 차단합니다. MyISAM 테이블에 대한 쓰기 작업은 동일한 테이블에 대한 다른 사용자의 읽기 및 쓰기 작업을 차단합니다. MyISAM 테이블의 읽기 작업은 쓰기 작업과 다릅니다. .time 및 쓰기 작업은 연속적입니다! 스레드가 테이블에 대한 쓰기 잠금을 획득하면 잠금을 보유한 스레드만 테이블을 업데이트할 수 있습니다. 다른 스레드의 읽기 및 쓰기 작업은 잠금이 해제될 때까지 기다립니다.
SESSION은 테이블 잠금 명령을 사용하여 테이블을 잠급니다. 이 SESSION은 잠긴 테이블의 레코드를 쿼리할 수 있지만 동시에 다른 테이블을 업데이트하거나 액세스하면 오류가 표시됩니다. 테이블의 레코드를 쿼리하지만 업데이트할 때 잠금 대기가 발생합니다.
위 내용은 MySQL Advanced Nine - MyISAM Table Lock(Shared Read Lock)의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!