mysql 데이터베이스 잠금 메커니즘 소개

不言
풀어 주다: 2019-02-01 10:20:56
앞으로
2720명이 탐색했습니다.

이 기사는 MySQL 데이터베이스 잠금 메커니즘에 대한 소개를 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 필요한 친구에게 도움이 되기를 바랍니다.

동시성 제어

  • 데이터베이스 관리 시스템에서 동시성 제어 작업은 여러 트랜잭션이 데이터베이스의 동일한 데이터에 액세스할 때 트랜잭션의 격리 및 단일성과 데이터베이스의 단일성이 파괴되지 않도록 하는 것입니다. 동시.

  • 블로킹, 타임스탬프, 낙관적 동시성 제어 및 비관적 동시성 제어는 동시성 제어에 사용되는 주요 기술 수단입니다.

Lock

동시 트랜잭션이 동시에 리소스에 액세스하면 데이터 불일치가 발생할 수 있으므로 데이터베이스 데이터의 일관성을 보장하기 위해 데이터 액세스 순서를 지정하는 메커니즘이 필요합니다. 잠금은 메커니즘 중 하나입니다(권장 튜토리얼: MySQL 튜토리얼)

잠금 분류

  • 작업에 따라 나누어 DML 잠금, DDL 잠금

  • 으로 나눌 수 있습니다. , 테이블 수준 잠금, 행 수준 잠금, 페이지 수준 잠금(mysql)

  • 으로 나눌 수 있으며 잠금 수준에 따라 공유 잠금, 배타적 잠금

  • 으로 나눌 수 있습니다.

    잠금 방식에 따라 자동 잠금, 디스플레이 잠금

  • 으로 나눌 수 있으며, 낙관적 잠금, 비관적 잠금

DML 잠금을 사용하여 행 수준 잠금(TX 잠금), 테이블 수준 잠금(TM 잠금)을 포함한 데이터 무결성. DDL 잠금은 테이블, 인덱스 등의 구조적 정의와 같은 데이터베이스 개체의 구조를 보호하는 데 사용되며 배타적 DDL 잠금, 공유 DDL 잠금, 인터럽트 가능한 구문 분석 잠금을 포함합니다.

행 수준 잠금

  • 행 수준 잠금은 Mysql의 잠금 강도 가장 얇은 종류의 잠금으로, 현재 작업의 행만 잠긴다는 의미입니다. 행 수준 잠금은 데이터베이스 작업의 충돌을 크게 줄일 수 있습니다. 잠금 세분성은 가장 작지만 잠금 오버헤드도 가장 큽니다. 행 수준 잠금은 공유 잠금독점 잠금

  • 으로 구분됩니다. 특징: 높은 오버헤드, 느린 잠금이 발생할 수 있으며 잠금 충돌 가능성이 가장 낮습니다. 동시성이 가장 높습니다

테이블 수준 잠금

  • Mysql에서 가장 큰 잠금 단위를 갖는 잠금입니다. 이는 현재 작업의 전체 테이블을 잠그는 것을 의미합니다. 리소스이며 대부분의 MySQL 엔진에서 지원됩니다. 가장 일반적으로 사용되는 MYISAM 및 INNODB는 테이블 수준 잠금을 지원합니다. 테이블 수준 잠금은 테이블 공유 읽기 잠금(공유 잠금)테이블 독점 쓰기 잠금(배타적 잠금)

  • 특징: 낮은 오버헤드, 빠른 잠금 세분성, 교착 상태 없음; 잠금 충돌이 가장 높고 동시성이 가장 낮습니다

페이지 수준 잠금

  • 페이지 수준 잠금은 MySQL에서 잠금 세분성이 행 수준 잠금과 테이블 수준 잠금 사이에 있는 일종의 잠금입니다. 테이블 수준 잠금은 빠르지만 충돌이 많습니다. 행 수준 잠금은 충돌이 거의 없지만 느립니다. 페이지 수준 잠금은 인접한 레코드 그룹을 잠그는 데 타협합니다. BDB는 페이지 수준 잠금을 지원합니다

Mysql 공통 스토리지 엔진 잠금 메커니즘

  • MyISAM 및 MEMORY는 테이블 수준 잠금을 사용합니다.

  • BDB는 페이지 수준 잠금 또는 테이블 수준 잠금을 사용합니다. 잠금

  • InnoDB는 행 수준 잠금과 테이블 수준 잠금을 지원합니다. 기본값은 행 수준 잠금입니다.

InnoDB 행 잠금 및 테이블 잠금

InnoDB 엔진은 행 잠금과 테이블 잠금을 모두 지원합니다. 전체 테이블을 잠그려면 언제 행을 잠그나요? ?

  • InnoDB 행 잠금은 인덱스 항목을 잠그는 방식으로 구현됩니다. 이는 데이터 블록에서 해당 데이터 행을 잠그는 방식으로 구현되는 Mysql 및 Oracle과 다릅니다. InnoDB의 행 잠금 구현 특성은 다음을 의미합니다. 인덱스 조건을 통해 데이터를 검색할 때만 InnoDB는 행 수준 잠금을 사용하고, 그렇지 않으면 InnoDb는 테이블 잠금을 사용합니다.

  • 실제 응용 프로그램에서는 InnoDB 행 잠금의 이 기능에 주의하세요. 그렇지 않으면 쉽게 많은 잠금 충돌이 발생하여 동시성 성능에 영향을 미칠 수 있습니다.

    • 인덱스 조건 없이 쿼리할 때 InnoDB는 행 잠금 대신 테이블 잠금을 사용합니다.

    • MySQL 행 잠금은 인덱스 추가를 위한 것이기 때문입니다. 잠금은 레코드에 대한 잠금이 아니므로 서로 다른 행의 레코드에 접근하더라도 동일한 인덱스의 키를 사용하면 잠금 충돌이 발생합니다.

    • 테이블에 여러 개의 인덱스가 있는 경우 서로 다른 트랜잭션은 서로 다른 인덱스를 사용하여 서로 다른 행을 잠글 수 있습니다. 또한 기본 키 인덱스, 고유 인덱스 또는 일반 인덱스를 사용하든 InnoDB는 행 잠금을 사용하여 데이터를 잠급니다

    • 조건에 인덱스 필드가 사용되더라도 데이터 검색에 인덱스를 사용할지 여부는 MySQL에서 일부 작은 테이블과 같이 전체 테이블 스캔이 더 효율적이라고 판단하는 경우 다양한 행 계획의 비용을 판단하여 결정됩니다. , 인덱스를 사용하지 않으며 이 경우 InnoDB는 행 잠금 대신 테이블 잠금을 사용합니다. 따라서 잠금 충돌을 분석할 때 SQL 실행 계획을 확인하는 것을 잊지 마세요

행 수준 잠금 및 교착 상태

  • MyISAM은 교착 상태를 생성하지 않습니다. MyISAM은 항상 필요한 모든 잠금을 한 번에 획득하므로 모두 만족하거나 모두 기다리기 때문입니다. InnoDB에서는 잠금이 점진적으로 획득되므로 교착 상태가 발생할 수 있습니다. MySQL에서는 행 수준 잠금이 레코드를 직접 잠그지 않고 인덱스를 잠급니다. 인덱스는 기본 키 인덱스와 기본 키가 아닌 인덱스로 구분됩니다. SQL 문이 기본 키 인덱스에서 작동하면 MySQL은 기본 키 인덱스가 아닌 명령문에서 작동하면 기본 키 인덱스를 먼저 잠급니다. 기본 키가 아닌 인덱스를 잠급니다. 업데이트 및 삭제 작업 중에 MySQL은 where 조건으로 검색된 모든 인덱스 레코드를 잠글 뿐만 아니라 인접한 키 값도 잠급니다. 이는 소위 다음 키 잠금

  • Deadlock:
  • 두 트랜잭션이 실행될 때 동시에 잠긴 기본 키 인덱스는 다른 관련 인덱스를 기다리고 있습니다. 다른 하나는 기본 키가 아닌 인덱스를 잠그고 기본 키 인덱스를 기다리고 있습니다. 교착 상태가 발생합니다.
  • 교착 상태가 발생한 후 InnoDB는 일반적으로 이를 감지하여 하나의 트랜잭션이 잠금을 해제하고 롤백하고 다른 트랜잭션이 잠금을 획득하여 트랜잭션을 완료하도록 할 수 있습니다.

  • 교착 상태 방지

다른 프로그램이 여러 액세스에 액세스하는 경우 각 테이블에 대해 동일한 순서로 테이블에 액세스하는 데 동의해 교착 상태 가능성을 크게 줄일 수 있습니다.

  • 동일 트랜잭션에서 필요한 모든 리소스를 한 번에 잠가 교착 상태 가능성을 줄이세요.

  • 교착 상태가 발생하기 쉬운 비즈니스 파트의 경우 업그레이드된 잠금 세분성을 사용하여 테이블 수준 잠금을 통해 교착 상태를 줄일 수 있습니다.

  • 공유 잠금 및 배타적 잠금

행 수준 잠금은 MySQL 잠금 및 행 수준 잠금의 가장 정밀한 잠금 세분성은 데이터베이스 작업의 충돌을 크게 줄일 수 있습니다. 행 수준 잠금은 공유 잠금과 배타적 잠금으로 구분됩니다

  • 1. 공유 잠금

공유 잠금(
읽기 잠금
    이라고도 함)은 읽기 작업에 의해 생성되는 잠금입니다. 다른 사용자는 동시에 데이터를 읽을 수 있지만 모든 공유 잠금이 해제될 때까지 어떤 트랜잭션도 데이터를 수정할 수 없습니다.
  • 트랜잭션 T가 데이터 A에 공유 잠금을 추가하면 다른 트랜잭션은 A에 공유 잠금만 추가할 수 있고 배타적 잠금은 추가할 수 없습니다. 공유 잠금이 부여된 트랜잭션은 데이터를 읽을 수만 있고 데이터를 수정할 수 없습니다

  • 트랜잭션 T가 데이터 A에 공유 잠금을 추가한 다음 데이터를 수정하면 다른 트랜잭션도 마찬가지로 공유 잠금을 얻을 수 없습니다. multiple 트랜잭션이 동일한 데이터에 대해 공유 잠금을 획득하면 어떤 트랜잭션도 데이터를 수정할 수 없습니다

  • Usage:

    SSELECT ... LOCK IN SHARE MODE
  • 쿼리 문 뒤에 LOCK IN SHARE MODE

    를 추가하세요. , Mysql은 쿼리 결과 세트의 각 행에 공유 잠금을 추가합니다. 다른 스레드가 쿼리 결과 세트의 임의 행에 배타적 잠금을 사용하지 않으면 공유 잠금을 성공적으로 적용할 수 있습니다. 그렇지 않으면 차단됩니다. 다른 스레드도 공유 잠금을 사용하여 테이블을 읽을 수 있으며 이러한 스레드는 동일한 버전의 데이터를 읽습니다

    2. 배타적 잠금
배타적 잠금은 트랜잭션 T에 배타적 잠금을 추가한 후 쓰기 잠금이라고도 합니다. 데이터 A가 있는 경우, 다른 거래는 더 이상 A에 어떤 유형의 봉쇄도 가할 수 없습니다. 배타적 잠금을 획득한 트랜잭션은 데이터를 읽고 수정할 수 있습니다
  • 사용법:

    SELECT ... FOR UPDATE
  • . 쿼리 문 뒤에
  • FOR UPDATE

    를 추가하면 MySQL은 쿼리 결과의 각 행에 배타적 잠금을 추가합니다. 다른 스레드가 쿼리 결과 집합의 모든 행에 배타적 잠금을 사용하지 않으면 배타적 잠금을 성공적으로 적용할 수 있습니다. 3. 의도 잠금

의도 잠금은 트랜잭션의 다음 행에 대해 요청되는 잠금 유형을 표시하도록 설계된 테이블 수준 잠금입니다. InnoDB의 두 테이블 잠금:
  • 의도 공유 잠금(IS): 트랜잭션이 데이터 행에 공유 잠금을 추가할 준비를 하고 있음을 나타냅니다. 즉, 데이터 행에 공유 잠금을 추가하기 전에 IS 잠금이 수행됩니다. 테이블의 IX 잠금을 먼저 얻어야 함을 의미 데이터 행에 대한 배타적 잠금
    • 의도 잠금은 InnoDB에 의해 자동으로 추가됩니다. 예, 사용자 개입이 필요하지 않습니다
    • 요약
  • 삽입, 업데이트, 삭제의 경우 InnoDB는 자동으로 데이터에 배타적 잠금을 추가합니다. 관련;

    일반 Select 문의 경우 InnoDB는 잠금을 추가하지 않으며 트랜잭션은 통과할 수 있습니다. 다음 문은 공유 잠금 또는 배타적 잠금을 명시적으로 추가합니다

공유 잠금: select... LOCK IN SHARE MODE

독점 잠금: 선택... 업데이트용

위 내용은 mysql 데이터베이스 잠금 메커니즘 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿