>  기사  >  데이터 베이스  >  mysql 행 수준 잠금의 구현 원리는 무엇입니까?

mysql 행 수준 잠금의 구현 원리는 무엇입니까?

coldplay.xixi
coldplay.xixi원래의
2020-10-26 15:47:236012검색

MySQL 행 수준 잠금 구현 원칙: 1. InnoDB 행 잠금은 인덱스 항목을 잠그는 방식으로 구현됩니다. 이것이 mysql과의 차이점입니다. 2. InnoDB는 행 수준 잠금을 결정합니다. 행 수준 잠금은 인덱스 조건을 통해 데이터를 검색하는 데만 사용할 수 있습니다. 테이블 수준 잠금을 직접 사용합니다.

mysql 행 수준 잠금의 구현 원리는 무엇입니까?

MySQL 행 수준 잠금 구현 원칙:

Lock은 다중 스레드를 실행할 때 리소스 액세스를 강제로 제한하는 데 사용되는 동기화 메커니즘입니다. 데이터베이스 잠금은 세분성에 따라 행 수준 잠금으로 나눌 수 있습니다. 자물쇠. 테이블 수준 잠금 및 페이지 수준 잠금

행 수준 잠금

행 수준 잠금은 MySQL에서 가장 세부적인 잠금 메커니즘으로, 현재 작동 중인 행만 잠기고 행 수준 잠금 충돌이 발생함을 의미합니다. 확률은 매우 낮고 세분성은 가장 작지만 잠금 비용은 가장 높습니다. 행 수준 잠금은 공유 잠금과 배타적 잠금으로 구분됩니다.

기능:

높은 오버헤드, 느린 잠금 및 교착 상태가 발생할 수 있습니다. 잠금 세분성은 최소화되고 잠금 충돌이 발생할 가능성이 높으며 동시성이 높습니다.

구현 원칙:

InnoDB 행 잠금은 다음과 같습니다. 이는 인덱스 항목을 잠그는 방식으로 수행됩니다. 이는 MySQL 및 Oracle과 다릅니다. 후자는 데이터베이스의 인덱스 항목을 잠그는 방식으로 수행됩니다. 이는 해당 데이터 행을 잠그면 달성됩니다. InnoDB의 행 수준 잠금은 행이 인덱스 조건을 통해서만 데이터를 검색하는 데 사용될 수 있음을 결정합니다. 레벨 잠금이 아닌 경우에는 테이블 레벨 잠금을 직접 사용하십시오.

특별한 주의 사항: 행 수준 잠금을 사용할 때 인덱스를 사용해야 합니다

예:

테이블 구조 만들기

CREATE TABLE `developerinfo` (
  `userID` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `passWord` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`userID`),
  KEY `PASSWORD_INDEX` (`passWord`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

데이터 삽입

INSERT INTO `developerinfo` VALUES ('1', 'liujie', 

'123456');
INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123');
INSERT INTO `developerinfo` VALUES ('3', 'tong', 

'123456');

(1) 기본 키 인덱스를 통해 데이터베이스 쿼리 행 잠금 사용

세 개의 명령줄 창을 엽니다. 테스트해 보세요

명령줄 창 1 명령줄 창 2 명령줄 창 3
mysql> set autocommit = 0;
쿼리 OK, 0개 행이 영향을 받았습니다.
mysql> 개발자 정보에서 *를 선택하세요. 여기서 사용자 ID는 '1'입니다. 업데이트;
+--------- +---------+----------+
| 사용자 ID | 비밀번호 |
+---------+------ -- +---------+
|123456 |
+--------- +---------+----------+
set
mysql의 1개 행 set autocommit = 0;
Query OK, 0개 행이 영향을 받았습니다.

mysql> 개발자 정보에서 *를 선택하세요. 여기서 사용자 ID는 '1'입니다. 업데이트;

대기 중

mysql> set autocommit = 0;
쿼리 확인, 0행 영향을 받음
mysql> userid = '3'인 개발자 정보에서 *를 선택하세요. 업데이트;
+---------+------+----------+
| 사용자 ID |
+------- +------+----------+
| 123456 |
+--------- +------+------------+
세트의 1개 행
mysql> 커밋;
쿼리 OK, 0개 행이 영향을 받았습니다
mysql> userid = 업데이트의 경우 '1'인 개발자 정보;
+---------+--------- +---------+
| 사용자 ID | 비밀번호 |
+---------+------- +---------+
|123456 |
+--------- +---------+----------+
1 행 in set


(2) 인덱스화되지 않은 필드를 쿼리하여 다음을 사용하여 데이터베이스를 쿼리합니다. 행 잠금

테스트를 위해 두 개의 명령줄 창 열기

명령줄 창 1 명령줄 창 2
mysql> set autocommit=0;
Query OK, 0 행이 영향을 받음
mysql> 업데이트를 위해 이름 = 'liujie'인 개발자 정보에서 *를 선택하세요.
+--------- +---------+----------+
| 사용자 ID |
+---------+--------- +----------+
|123456 |
+--------- +---------+----------+
세트의 1개 행
mysql> autocommit=0;
쿼리 확인, 0개 행이 영향을 받음
mysql> 개발자 정보에서 * 선택 여기서 이름 = 업데이트용 'tong';

Wait

mysql> 커밋;
쿼리 확인, 영향을 받은 행 0개
mysql> 개발자 정보에서 *를 선택합니다. 여기서 이름 = 'liujie' 업데이트;
+---------+---------+
| 사용자 ID |
+------- -+-------+----------+
| 123456 |
+---------+-------+ ----------+
세트의 1개 행

(3) 데이터베이스를 쿼리하려면 고유하지 않은 인덱스 필드를 쿼리합니다. 행 잠금을 사용하여 여러 행을 잠급니다.

Mysql의 행 잠금은 레코드가 아닌 인덱스에 대한 잘못된 잠금이므로 다른 레코드가 잠기는 시나리오가 있을 수 있습니다.

3개 열기 테스트를 위해 두 개의 명령줄 창 사용

명령줄 창 1명령줄 창 2명령줄 창 3mysql> set autocommit=0;mysql> set autocommit =0 ;mysql> set autocommit = 0;commit;mysql> 개발자 정보(여기서 사용자 ID = '1') 업데이트;
Query OK, 0 행 영향 받음
mysql> 업데이트를 위해 비밀번호 = '123456
'인 곳에서 *를 선택하세요.
+---------+----------+
| | 비밀번호 |
+--------- +---------+---------+
| 123456 |
| 3 | 통 | 123456 |
+---------+---------+------- +
2개 행 세트
쿼리 확인, 0개 행이 영향을 받음

mysql> userid가 =인 개발자 정보에서 * 선택 업데이트의 경우 '1';

wait

Query OK, 0행 영향을 받음
mysql> userid = '2
'인 개발자 정보에서 *를 선택하세요. 업데이트;
+---------+---------+
| 사용자 ID |
+------- -+-------+----------+
|2 | |
+---------+---------+----------+
세트의 1개 행
+---------+---------+
| 사용자 ID |
+------- -+-------+----------+
| 123456 |
+---------+-------+ ----------+
1 row in set

(4) 인덱스를 사용하여 해당 조건에서 데이터베이스를 연산하고 검색할 때 인덱스 사용 여부는 mysql에서도 필요합니다. 다양한 실행 계획을 판단 인덱스 사용 여부를 결정하세요. 인덱스를 판단하기 위해 explain을 어떻게 사용할지 결정해야 한다면 분해에 대한 다음 장을 들어보세요.


관련 무료 학습 권장 사항: mysql tutorial(동영상) )

위 내용은 mysql 행 수준 잠금의 구현 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.