이 글에서는 MySQL의 삽입의도 잠금에 대해 이야기하고 삽입의도 잠금이 무엇인지 소개하겠습니다. 의도 잠금을 삽입해야 하는 이유는 무엇입니까? 모두에게 도움이 되기를 바랍니다!
Insert Intention Lock, 중국어로 Insert Intention Lock이라고도 합니다.
이것은 이전에 설명한 Gap Lock의 보완 사항으로 간주할 수 있습니다. Gap Lock에 대해 여전히 이해가 되지 않으면 Record Lock, Gap Lock 및 Next-Key Locks를 참조하세요.
이미 Gap Lock을 사용하면 팬텀 읽기 문제를 어느 정도 해결할 수 있지만 이전에는 몇 가지 문제가 있는 것 같습니다.
다음 테이블이 있다고 가정합니다.
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `age` (`age`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
id는 자동 증가된 기본 키이고 age는 공통 인덱스입니다. 이제 테이블에 다음 데이터가 있습니다.
다음 삽입을 실행한다고 가정합니다. SQL:
begin;insert into user(username,age) values('wangwu',95);
참고: 이 SQL은 실행되었지만 트랜잭션이 아직 커밋되지 않았습니다.
저희가 이전에 Gap Lock에 대해 배운 지식에 따르면, 이때 Gap Lock의 범위는 (89,99)이므로 이 범위에는 연령을 삽입할 수 없습니다.
이 경우 친구들은 데이터 삽입의 효율성이 너무 낮고 잠금 충돌이 발생하기 쉽다는 것을 알게 될 것입니다. 그러면 어떻게 해야 할까요?
오늘 소개할 삽입의도 잠금은 이러한 문제를 해결하기 위해 사용됩니다.
MySQL 공식 웹사이트의 소개를 살펴보겠습니다.
삽입 의도 잠금은 행 삽입 전에 INSERT 연산에 의해 설정되는 간격 잠금의 일종입니다. lock은 동일한 인덱스 갭에 삽입되는 여러 트랜잭션이 갭 내의 동일한 위치에 삽입되지 않는 경우 서로 기다릴 필요가 없도록 삽입 의도를 나타냅니다. 값이 4인 인덱스 레코드가 있다고 가정합니다. 7. 각각 5와 6의 값을 삽입하려는 별도의 트랜잭션은 삽입된 행에 대한 배타적 잠금을 획득하기 전에 삽입 의도 잠금으로 각각 4와 7 사이의 간격을 잠그지만, 행은 충돌하지 않습니다.
대략 번역하면 다음과 같습니다.
삽입 의도 잠금은 INSERT 작업 이전에 설정된 일종의 간격 잠금입니다. 삽입 의도 잠금은 삽입 의도, 즉 여러 개의 서로 다른 트랜잭션이 있을 때를 나타냅니다. 동시에 동일한 인덱스의 동일한 인덱스로 이동합니다. gap에 데이터를 삽입할 때 서로 기다릴 필요가 없습니다. 즉, 차단되지 않습니다. (단순히 이전 gap lock 이론을 따르면 다음 트랜잭션이 동일한 간격에 데이터를 삽입할 수 있으려면 간격 잠금이 해제될 때까지 기다려야 합니다. 값이 4와 7인 인덱스 레코드가 있다고 가정합니다. 이제 값이 각각 5와 6인 레코드를 삽입하려는 두 개의 트랜잭션이 있습니다. 각 트랜잭션은 배타적 잠금을 획득하기 전에 삽입 의도 잠금을 사용하여 4와 7 사이를 잠급니다. 삽입된 행에 간격이 있지만 행이 충돌하지 않기 때문에 두 트랜잭션이 서로 차단되지 않습니다.
의도 잠금을 삽입하는 것입니다.
친구 여러분, 송 형제가 이전에 모두와 Gap Lock에 대해 이야기하고 이것이 REPEATABLE READ 격리 수준에서 고유한 제품이라고 말했기 때문에 이제 Insert Intention Lock은 특별한 Gap Lock입니다. 물론, 반복 읽기의 격리 수준에서도 적용됩니다.
다음으로 두 가지 간단한 사례를 통해 의도 잠금 삽입을 보여드리겠습니다.
테이블 구조와 데이터는 첫 번째 섹션과 일치합니다.
먼저 세션 A에서 다음 코드를 실행합니다.
이제 세션 A의 트랜잭션은 커밋되지 않습니다.
다음으로 세션 B에서도 삽입 작업을 수행합니다.
세션 B도 차단 없이 정상적으로 실행될 수 있음을 확인했습니다.
이는 두 개의 삽입의도 잠금이 호환 가능하며 공존할 수 있음을 보여줍니다.
호환되지 않는 또 다른 예를 살펴보겠습니다.
먼저 세션 A에서 다음 SQL 쿼리를 실행하여 80보다 오래된 레코드를 쿼리하고 배타적 잠금을 추가합니다.
다음으로 세션 B에서 다음 코드를 실행하여 데이터 행을 삽입합니다.
친구 여러분, 이 작업이 차단되는 것을 볼 수 있습니다! 차단 이유는 삽입의도 잠금과 배타적 잠금이 상호 배타적이기 때문이다.
차단 상황을 활용하여 세션 C에서는 이전 기사에서 사용한 show engine innodb statusG
명령을 사용하여 TRANSACTION 노드를 중심으로 잠금 상황을 확인합니다.
출력 콘텐츠에서 빨간색이 있는 곳 상자가 선택되면 삽입 의도 잠금이 있음을 명확하게 나타냅니다.
요약:
인텐션 잠금 장치를 삽입하세요. 이름에 의도라는 단어가 있지만 실제로는 특별한 간격 잠금 장치입니다.
삽입 의도 잠금은 상호 배타적이지 않습니다.
의도 잠금과 배타적 잠금 사이에 상호 배제를 삽입합니다.
알겠습니다. 질문이 있으시면 토론을 위해 메시지를 남겨주세요.
【관련 추천: mysql 비디오 튜토리얼】
위 내용은 MySQL의 삽입 의도 잠금에 대해 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!