MySQL과 그 솔루션에서 발생하는 교착 상태 문제

하나, 교착 상태 문제

   이유 : 사용자 A가 테이블 A에 액세스 한 다음 (테이블 A 잠금) 테이블 B에 액세스하고 다른 사용자 B가 테이블 B에 액세스 한 다음 (테이블 B 잠금) 테이블 A에 액세스하려고 시도합니다. 이 (가) 잠겼으며 계속하기 전에 사용자 B가 테이블 B를 해제 할 때까지 기다려야합니다. 마찬가지로 계속하려면 사용자 B가 사용자 A가 테이블 A를 해제 할 때까지 기다려야합니다.이 교착 상태가 발생합니다.

잠금 유형 : 배타적 잠금 (X 잠금) 및 공유 잠금 (S 잠금).

소위 배타적 잠금 (X 잠금)은 트랜잭션 T가 데이터 A에 X 잠금을 추가 할 때 트랜잭션 T 만 데이터 A를 읽고 수정할 수 있다는 것입니다.

소위 공유 잠금 (S 잠금) 트랜잭션 T가 데이터 A에 S 잠금을 추가 할 때, 다른 트랜잭션 만 추가 할 수있다 S 잠금을 데이터 A에 T가 A에 S 잠금을 해제 할 때까지,하지만 X 잠금을 추가 할 수 없습니다
거래하는 경우 T 쌍 데이터 객체 A는 S 잠금을 추가 한 다음 T는 A를 읽을 수 있지만 업데이트 할 수는 없습니다 (따라서 S 잠금은 읽기 잠금이라고도 함). T가 A에 대한 S 잠금을 해제하기 전에 다른 트랜잭션이 A를 다시 S 잠금을 추가 할 수 있습니다. 그러나 X 잠금을 추가 할 수 없으므로 A는 읽을 수 있지만 A는 업데이트 할 수 없습니다.

 

둘째, 계획

해결책:

이런 종류의 교착 상태는 비교적 흔하고 프로그램 의 버그인해 발생 하며 프로그램의 논리를 조정하는 것 외에는 다른 방법이 없습니다. 프로그램의 논리를주의 깊게 분석하십시오. 데이터베이스에서 다중 테이블 작업의 경우 동일한 순서 로 처리하고 동시에 두 개의 리소스를 잠그지 않도록하십시오. 예를 들어 두 테이블 A와 B를 작동 할 때는 항상 A와 B의 순서를 따르십시오. 두 개의 리소스를 동시에 잠 가야하는 경우 리소스가 항상 같은 순서로 잠기도록해야합니다.

세, 다른 자물쇠

MySQL 스토리지 엔진은 테이블 수준 잠금, 행 수준 잠금 및 페이지 수준 잠금의 세 가지 유형 (수준) 잠금 메커니즘을 사용합니다.

1. 테이블 수준 잠금 ( 테이블 수준 )
    테이블 수준 잠금은 MySQL 스토리지 엔진 중에서 가장 세분화 된 잠금 메커니즘입니다. 잠금 메커니즘의 가장 큰 특징은 구현 로직이 매우 간단하고 시스템의 부정적인 영향이 최소화된다는 것입니다. 따라서 잠금 획득 및 해제 속도가 매우 빠릅니다. 테이블 수준 잠금은 한 번에 전체 테이블을 잠그기 때문에 우리를 괴롭히는 교착 상태 문제를 피할 수 있습니다.
     물론, 큰 잠금 세분화로 인한 가장 큰 부정적인 영향은 잠긴 리소스에 대한 경합 가능성이 가장 높아서 큰 할인이 발생한다는 것입니다. MyISAM , MEMORY CSV 와 같은 일부 비 트랜잭션 스토리지 엔진
은 주로 테이블 수준 잠금에 사용 됩니다.

2. 행 수준 잠금 ( 행 수준 ) 수준 잠금
     가장 큰 특징은 잠긴 개체의 단위가 매우 작고 주요 데이터베이스 관리 소프트웨어가 달성 한 가장 작은 단위라는 것입니다. 잠금 세분성이 매우 작기 때문에 잠긴 리소스에 대한 경합 가능성도 가장 작아 애플리케이션에 가능한 한 많은 동시 처리 기능을 제공하고 일부 높은 동시성 애플리케이션 시스템의 전체 성능을 향상시킬 수 있습니다.
     동시 처리 기능에서 더 큰 이점을 가질 수 있지만 행 수준 잠금은 또한 많은 단점을 가져옵니다. 잠긴 리소스의 세분성은 매우 작기 때문에 매번 잠금을 획득하고 해제하기 위해해야 ​​할 일이 더 많으며 소비량은 당연히 더 큽니다. 또한 행 수준 잠금은 교착 상태에 가장 취약합니다.
행 수준 잠금의 주요 용도는 InnoDB 스토리지 엔진입니다.

3. 페이지 수준 잠금 ( 페이지 수준 )
     페이지 수준 잠금은 MySQL 의 고유 한 잠금 수준이며 다른 데이터베이스 관리 소프트웨어에서는 그다지 일반적이지 않습니다. 페이지 수준 잠금의 특징은 잠금의 세분성이 행 수준 잠금과 테이블 수준 잠금 사이에 있다는 것입니다. 따라서 잠금을 획득하는 데 필요한 리소스 오버 헤드와 제공 할 수있는 동시 처리 기능도 위 두 수준 사이에 있습니다. . 또한 페이지 수준 잠금은 행 수준 잠금과 동일하며 교착 상태가 발생합니다.

잠금 요약 :

테이블 수준 잠금 : 낮은 오버 헤드 및 빠른 잠금, 교착 상태 없음, 큰 잠금 세분성, 잠금 충돌 가능성이 가장 높고 동시성이 가장 낮음,
행 수준 잠금 : 높은 오버 헤드 및 느린 잠금, 교착 상태가 발생합니다. 잠금 충돌 가능성이 가장 낮고 동시성이 가장 높습니다.     
페이지 잠금 : 오버 헤드 및 잠금 시간이 테이블 잠금과 행 잠금 사이에 있습니다. 교착 상태가 발생합니다. 잠금 세분성은 테이블 잠금과 행 잠금 사이에 있으며 동시성 등급은 평균입니다.

적용 가능성 :
잠금의 관점에서 볼 때 테이블 수준 잠금은 쿼리에 중점을 두는 응용 프로그램에 더 적합하며 웹 응용 프로그램과 같은 인덱스 조건에 따라 소량의 데이터 만 업데이트됩니다. 인덱스 조건에 따라 많은 수의 동시 업데이트 다른 데이터 및 일부 온라인 트랜잭션 처리 ( OLTP ) 시스템 과 같은 동시 쿼리 응용 프로그램 .

 

MySQL 잠금 처리에 대한 좋은 기사 권장 사항 :

http://hedengcheng.com/?p=771#_Toc374698316

추천

출처blog.csdn.net/baidu_28068985/article/details/102896535