MySQL 행 수준 잠금 구현 원칙: 1. InnoDB 행 잠금은 인덱스 항목을 잠그는 방식으로 구현됩니다. 이것이 mysql과의 차이점입니다. 2. InnoDB는 행 수준 잠금을 결정합니다. 행 수준 잠금은 인덱스 조건을 통해 데이터를 검색하는 데만 사용할 수 있습니다. 테이블 수준 잠금을 직접 사용합니다.
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개 열기 테스트를 위해 두 개의 명령줄 창 사용명령줄 창 2 | 명령줄 창 3 | |
Query OK, 0 행 영향 받음 mysql> 업데이트를 위해 비밀번호 = '123456 '인 곳에서 *를 선택하세요. +---------+----------+ | | 비밀번호 | +--------- +---------+---------+ | 123456 | | 3 | 통 | 123456 | +---------+---------+------- + 2개 행 세트 | mysql> set autocommit =0 ;쿼리 확인, 0개 행이 영향을 받음 mysql> userid가 =인 개발자 정보에서 * 선택 업데이트의 경우 '1';wait | mysql> set autocommit = 0;Query OK, 0행
영향을 받음 mysql> userid = '2 '인 개발자 정보에서 *를 선택하세요. 업데이트; +---------+---------+ | 사용자 ID | +------- -+-------+----------+ |2 | | +---------+---------+----------+ 세트의 1개 행 |
mysql> 개발자 정보(여기서 사용자 ID = '1') 업데이트; | +---------+---------+ | 사용자 ID | +------- -+-------+----------+ | 123456 | +---------+-------+ ----------+ 1 row in set |
관련 무료 학습 권장 사항: mysql tutorial(동영상) )
위 내용은 mysql 행 수준 잠금의 구현 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!