이 기사는 MySQL 데이터베이스 잠금 메커니즘에 대한 소개를 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 필요한 친구에게 도움이 되기를 바랍니다.
동시성 제어
데이터베이스 관리 시스템에서 동시성 제어 작업은 여러 트랜잭션이 데이터베이스의 동일한 데이터에 액세스할 때 트랜잭션의 격리 및 단일성과 데이터베이스의 단일성이 파괴되지 않도록 하는 것입니다. 동시.
블로킹, 타임스탬프, 낙관적 동시성 제어 및 비관적 동시성 제어는 동시성 제어에 사용되는 주요 기술 수단입니다.
동시 트랜잭션이 동시에 리소스에 액세스하면 데이터 불일치가 발생할 수 있으므로 데이터베이스 데이터의 일관성을 보장하기 위해 데이터 액세스 순서를 지정하는 메커니즘이 필요합니다. 잠금은 메커니즘 중 하나입니다(권장 튜토리얼: MySQL 튜토리얼)
작업에 따라 나누어 DML 잠금, DDL 잠금
으로 나눌 수 있습니다. , 테이블 수준 잠금, 행 수준 잠금, 페이지 수준 잠금(mysql)
으로 나눌 수 있으며 잠금 수준에 따라 공유 잠금, 배타적 잠금
잠금 방식에 따라 자동 잠금, 디스플레이 잠금
으로 나눌 수 있으며, 낙관적 잠금, 비관적 잠금
DML 잠금을 사용하여 행 수준 잠금(TX 잠금), 테이블 수준 잠금(TM 잠금)을 포함한 데이터 무결성. DDL 잠금은 테이블, 인덱스 등의 구조적 정의와 같은 데이터베이스 개체의 구조를 보호하는 데 사용되며 배타적 DDL 잠금, 공유 DDL 잠금, 인터럽트 가능한 구문 분석 잠금을 포함합니다.
행 수준 잠금은 Mysql의 잠금 강도 가장 얇은 종류의 잠금으로, 현재 작업의 행만 잠긴다는 의미입니다. 행 수준 잠금은 데이터베이스 작업의 충돌을 크게 줄일 수 있습니다. 잠금 세분성은 가장 작지만 잠금 오버헤드도 가장 큽니다. 행 수준 잠금은 공유 잠금 및 독점 잠금
으로 구분됩니다. 특징: 높은 오버헤드, 느린 잠금이 발생할 수 있으며 잠금 충돌 가능성이 가장 낮습니다. 동시성이 가장 높습니다
Mysql에서 가장 큰 잠금 단위를 갖는 잠금입니다. 이는 현재 작업의 전체 테이블을 잠그는 것을 의미합니다. 리소스이며 대부분의 MySQL 엔진에서 지원됩니다. 가장 일반적으로 사용되는 MYISAM 및 INNODB는 테이블 수준 잠금을 지원합니다. 테이블 수준 잠금은 테이블 공유 읽기 잠금(공유 잠금)과 테이블 독점 쓰기 잠금(배타적 잠금)
특징: 낮은 오버헤드, 빠른 잠금 세분성, 교착 상태 없음; 잠금 충돌이 가장 높고 동시성이 가장 낮습니다
페이지 수준 잠금은 MySQL에서 잠금 세분성이 행 수준 잠금과 테이블 수준 잠금 사이에 있는 일종의 잠금입니다. 테이블 수준 잠금은 빠르지만 충돌이 많습니다. 행 수준 잠금은 충돌이 거의 없지만 느립니다. 페이지 수준 잠금은 인접한 레코드 그룹을 잠그는 데 타협합니다. BDB는 페이지 수준 잠금을 지원합니다
MyISAM 및 MEMORY는 테이블 수준 잠금을 사용합니다.
BDB는 페이지 수준 잠금 또는 테이블 수준 잠금을 사용합니다. 잠금
InnoDB는 행 수준 잠금과 테이블 수준 잠금을 지원합니다. 기본값은 행 수준 잠금입니다.
InnoDB 엔진은 행 잠금과 테이블 잠금을 모두 지원합니다. 전체 테이블을 잠그려면 언제 행을 잠그나요? ?
InnoDB 행 잠금은 인덱스 항목을 잠그는 방식으로 구현됩니다. 이는 데이터 블록에서 해당 데이터 행을 잠그는 방식으로 구현되는 Mysql 및 Oracle과 다릅니다. InnoDB의 행 잠금 구현 특성은 다음을 의미합니다. 인덱스 조건을 통해 데이터를 검색할 때만 InnoDB는 행 수준 잠금을 사용하고, 그렇지 않으면 InnoDb는 테이블 잠금을 사용합니다.
실제 응용 프로그램에서는 InnoDB 행 잠금의 이 기능에 주의하세요. 그렇지 않으면 쉽게 많은 잠금 충돌이 발생하여 동시성 성능에 영향을 미칠 수 있습니다.
인덱스 조건 없이 쿼리할 때 InnoDB는 행 잠금 대신 테이블 잠금을 사용합니다.
MySQL 행 잠금은 인덱스 추가를 위한 것이기 때문입니다. 잠금은 레코드에 대한 잠금이 아니므로 서로 다른 행의 레코드에 접근하더라도 동일한 인덱스의 키를 사용하면 잠금 충돌이 발생합니다.
테이블에 여러 개의 인덱스가 있는 경우 서로 다른 트랜잭션은 서로 다른 인덱스를 사용하여 서로 다른 행을 잠글 수 있습니다. 또한 기본 키 인덱스, 고유 인덱스 또는 일반 인덱스를 사용하든 InnoDB는 행 잠금을 사용하여 데이터를 잠급니다
조건에 인덱스 필드가 사용되더라도 데이터 검색에 인덱스를 사용할지 여부는 MySQL에서 일부 작은 테이블과 같이 전체 테이블 스캔이 더 효율적이라고 판단하는 경우 다양한 행 계획의 비용을 판단하여 결정됩니다. , 인덱스를 사용하지 않으며 이 경우 InnoDB는 행 잠금 대신 테이블 잠금을 사용합니다. 따라서 잠금 충돌을 분석할 때 SQL 실행 계획을 확인하는 것을 잊지 마세요
MyISAM은 교착 상태를 생성하지 않습니다. MyISAM은 항상 필요한 모든 잠금을 한 번에 획득하므로 모두 만족하거나 모두 기다리기 때문입니다. InnoDB에서는 잠금이 점진적으로 획득되므로 교착 상태가 발생할 수 있습니다. MySQL에서는 행 수준 잠금이 레코드를 직접 잠그지 않고 인덱스를 잠급니다. 인덱스는 기본 키 인덱스와 기본 키가 아닌 인덱스로 구분됩니다. SQL 문이 기본 키 인덱스에서 작동하면 MySQL은 기본 키 인덱스가 아닌 명령문에서 작동하면 기본 키 인덱스를 먼저 잠급니다. 기본 키가 아닌 인덱스를 잠급니다. 업데이트 및 삭제 작업 중에 MySQL은 where 조건으로 검색된 모든 인덱스 레코드를 잠글 뿐만 아니라 인접한 키 값도 잠급니다. 이는 소위 다음 키 잠금
교착 상태가 발생한 후 InnoDB는 일반적으로 이를 감지하여 하나의 트랜잭션이 잠금을 해제하고 롤백하고 다른 트랜잭션이 잠금을 획득하여 트랜잭션을 완료하도록 할 수 있습니다.
교착 상태 방지
동일 트랜잭션에서 필요한 모든 리소스를 한 번에 잠가 교착 상태 가능성을 줄이세요.
교착 상태가 발생하기 쉬운 비즈니스 파트의 경우 업그레이드된 잠금 세분성을 사용하여 테이블 수준 잠금을 통해 교착 상태를 줄일 수 있습니다.
공유 잠금 및 배타적 잠금
1. 공유 잠금
트랜잭션 T가 데이터 A에 공유 잠금을 추가하면 다른 트랜잭션은 A에 공유 잠금만 추가할 수 있고 배타적 잠금은 추가할 수 없습니다. 공유 잠금이 부여된 트랜잭션은 데이터를 읽을 수만 있고 데이터를 수정할 수 없습니다
트랜잭션 T가 데이터 A에 공유 잠금을 추가한 다음 데이터를 수정하면 다른 트랜잭션도 마찬가지로 공유 잠금을 얻을 수 없습니다. multiple 트랜잭션이 동일한 데이터에 대해 공유 잠금을 획득하면 어떤 트랜잭션도 데이터를 수정할 수 없습니다
Usage:
SSELECT ... LOCK IN SHARE MODE쿼리 문 뒤에 LOCK IN SHARE MODE
를 추가하세요. , Mysql은 쿼리 결과 세트의 각 행에 공유 잠금을 추가합니다. 다른 스레드가 쿼리 결과 세트의 임의 행에 배타적 잠금을 사용하지 않으면 공유 잠금을 성공적으로 적용할 수 있습니다. 그렇지 않으면 차단됩니다. 다른 스레드도 공유 잠금을 사용하여 테이블을 읽을 수 있으며 이러한 스레드는 동일한 버전의 데이터를 읽습니다2. 배타적 잠금
사용법:
SELECT ... FOR UPDATE를 추가하면 MySQL은 쿼리 결과의 각 행에 배타적 잠금을 추가합니다. 다른 스레드가 쿼리 결과 집합의 모든 행에 배타적 잠금을 사용하지 않으면 배타적 잠금을 성공적으로 적용할 수 있습니다. 3. 의도 잠금
일반 Select 문의 경우 InnoDB는 잠금을 추가하지 않으며 트랜잭션은 통과할 수 있습니다. 다음 문은 공유 잠금 또는 배타적 잠금을 명시적으로 추가합니다
독점 잠금: 선택... 업데이트용
위 내용은 mysql 데이터베이스 잠금 메커니즘 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!