MySQL 및 InnoDB의 공유 잠금 및 배타적 잠금을 설명하는 예
이 기사는 MySQL의 공유 잠금 및 독점 잠금에 대한 관련 지식을 제공하며 모든 사람에게 도움이 되기를 바랍니다.
공유 잠금
공유 잠금, S 잠금, 읽기 잠금 이 모두 그의 이름입니다.
그리고 나는 그에게 공유 읽기 잠금이라고 부르고 싶습니다.
공유(S) 잠금은 잠금을 보유한 트랜잭션이 읽을 수 있도록 허용합니다.
공유 잠금을 사용하면 잠금을 보유한 트랜잭션이 읽을 수 있습니다.
여기서 나눔은 읽기 나눔입니다.
즉, 행 수준이든 테이블 수준이든 특정 데이터에 공유 읽기 잠금이 설정되면 다른 트랜잭션은 계속해서 읽을 수 있지만(즉, 공유 읽기 잠금을 유지할 수 있음) 쓸 수 없습니다. 즉, 읽을 수 없습니다. 쓰기 상호 배제 .
그나저나 공유 잠금(shared read lock)을 추가하는 방법을 소개하겠습니다:
Up 테이블 수준 공유 잠금, 즉 테이블 수준 공유 읽기 잠금:
select * from table(表) lock in share mode ;
업스트림 수준 공유 잠금, that 행 수준 공유 읽기 잠금:
select * from table(表)where id = 10 lock in share mode ;
간단히 말씀드리자면, InnoDB에서는 행 잠금을 사용하려는 경우 행 잠금만 사용하는 것이 아니라는 점에 유의하세요. 행 잠금의 트리거 조건을 다시 검토해 보겠습니다. 시작 부분) :
전용 잠금(Exclusive lock) 잠금)
전용 잠금, 쓰기 잠금, X 잠금은 모두 그의 이름입니다.
저는 그 사람을 독점 쓰기 잠금이라고 부르고 싶습니다.
배타적(X) 잠금은 잠금을 보유한 트랜잭션이 업데이트되거나 삭제되도록 허용합니다.
배타적(X) 잠금을 사용하면 잠금을 보유한 트랜잭션을 업데이트하거나 삭제할 수 있습니다.
독점적인 단어입니다. 농구를 해 본 적이 있나요? 저는 중학교 때 농구를 할 줄 몰랐어요. 공을 잡고 있으면 패스를 안 하더군요. 내 반 친구들은 나에게 당신이 너무 외롭다고 말했습니다.
네, 저는 매우 외롭습니다. 이 배타적 쓰기 잠금(독점 잠금)과 마찬가지로 매우 독특합니다.
트랜잭션이 특정 데이터에 배타적 쓰기 잠금(배타적 잠금)을 추가하면 현재 트랜잭션만 해당 데이터를 수정하거나 삭제할 수 있습니다.
다른 거래는 읽거나 쓸 수 없습니다. 이 잠금은 매우 고유하므로 다른 트랜잭션이 이를 활용할 수 있으려면 이 고유한 잠금이 모두 사용(해제)될 때까지 기다려야 합니다.
그래서 배타적 쓰기 잠금(exclusive lock)은 읽기와 쓰기에 상호 배타적이며 쓰기와 쓰기에 상호 배타적입니다.
그나저나 배타적 잠금(배타적 쓰기 잠금)을 추가하는 방법을 소개하겠습니다:
업 테이블 수준 배타적 잠금, 즉 테이블 수준 배타적 쓰기 잠금:
select * from table for update ;
업스트림 수준 배타적 잠금, 즉 행 수준 독점 쓰기 잠금:
select * from table where id =10 for update ;
여기서 좀 더 설명하겠습니다. InnoDB에서는 행 잠금을 사용하려는 경우 행 잠금만 사용하는 것이 아닙니다. 행 잠금의 트리거 조건을 검토해 보겠습니다. 다시 (처음에 언급함):
위 SQL은 인덱스에 도달하고 id가 인덱스이기 때문에 행 수준에서 배타적 잠금을 얻을 수 있습니다.
아마도 이것을 보면 공유 잠금 및 독점 잠금에 대해 여전히 모호할 것입니다. 읽기-읽기 공유, 읽기-쓰기 상호 배제, 쓰기-쓰기 상호 배제 등이 무엇인지 대략적으로 알 수 있습니다.
그러므로 우리는 이 두 자물쇠를 다시 하나님의 관점에서 바라볼 필요가 있습니다,
red 거래 연산 1
blue 거래 연산 2
공유 잠금(공유 읽기 잠금) | 독점 잠금(독점 쓰기 잠금) | |
공유 잠금(공유 읽기 잠금) | 예, 호환 가능, 함께 읽기 | 아니요, 호환되지 않습니다. 글을 쓰려면 공유 잠금이 사라질 때까지 기다려야 합니다. 독점적으로 잠겨 있어 다른 사람은 아무것도 할 수 없습니다 |
那么如果你看到这里,还是对 共享锁 & 排他锁还只是云里雾里。 那我只有动手了! 实战介绍,演示 所谓的读读共享、读写互斥、写写互斥 。 在演示读读共享、读写互斥、写写互斥前, 我必须点明一点! 在这篇文章里面,我介绍了一些上 共享锁(共享读锁)、排他锁(独占写锁)的方式 。 但是 可以看到写的查询sql 都是后面加了东西的 , lock in share mode ,for update .... 等。 所以我想点明的一点是, 如果是使用 普通的查询 ,是 什么锁都没上的!就好像平时我们经常写的 select语句默认不会加任何锁类型select语句默认不会加任何锁类型select语句默认不会加任何锁类型而排他锁,除了 select .... for update ,InnoDB引擎 默认的修改 、插入、删除(update,insert,delete)都是会给操作的相关数据 加 排他锁的 . 废话不多说,我们上才艺: 准备一些用于测试的数据。 建表: DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `age` int(11) NULL DEFAULT NULL, `sex` tinyint(1) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 로그인 후 복사 搞点模拟数据:
第一个小实践:我们不废话,我们直接上共享读锁, 看看是不是能 符合刚才我们的理论 读读共享,读写互斥! 1. 我们先给id=3这数据上个 共享读锁: 2.基于当前状况, 我们再执行一下查询语句,也是使用共享读锁的: 3.那么也是基于当前情况,我们再执行一下使用排他写锁的查询语句,可以发现 读写互斥了: 4.验证下,我们查看当前是否存在事务在等待锁: 可以从结果中看出 事务请求id 34847在等待锁: 我们再查询一下,那些事务在使用锁, 而34847事务 在使用 X锁, 也就是排他写锁(但是由于共享读锁先上了,所以读写互斥了),所以造成了34847事务 在等待锁。 5.那么如果我们一直不 COMMIT 共享读锁, 34847事务 会永无止息地等待锁吗? 那么肯定是不可能允许这种一直等待的场景的: 所以mysql会有个等待锁资源超时的机制,这种情况就会直接返回查询失败的结果。 根据第一个小实践,我们得出一个很明显的结论:当某数据上了 共享读锁 S 时, 只允许其他事务上共享读锁 S, 因为读读共享; 不允许其他事务上 独占写锁 X(除非把这个共享读锁S 释放掉),因为读写互斥。 第二个小实践:1.我们直接给某行数据上个排他写锁 X (注意我们的事务是没有执行COMMIT的) : 2. 我们接下来去 通过共享读锁去获取数据,看看会发生什么? 这就是 独占写锁 X 的 读写互斥、写写互斥 (写写互斥的场景就不展示了). 再验证下,我们看下是不是存在事务在等待锁资源: 3. 독점 쓰기 잠금이 해제되지 않으면 다른 트랜잭션이 계속 대기하게 됩니까? 동일합니다. 쿼리 실패를 반환하기 위해 시간 초과가 발생할 때까지 기다립니다. 약간 연습을 추가합니다. 1 여전히 동일합니다. 먼저 COMMIT 없이 특정 데이터에 독점 쓰기 잠금을 부여합니다. 2. 일반 쿼리를 실행하고 다음을 선택합니다. 일반 Select 문도 정상적으로 얻어지는 것을 볼 수 있는데, 그 이유는 무엇입니까? 아까도 언급했으니까 소위 읽기-읽기 공유, 읽기-쓰기 상호 배제, 쓰기-쓰기 상호 배제는 모두 잠금 리소스에 대한 것입니다. 잠금 리소스 경쟁이 없으면 상호 배제 또는 상호 배제가 없어야 합니다. 추천 학습: mysql 비디오 튜토리얼 위 내용은 MySQL 및 InnoDB의 공유 잠금 및 배타적 잠금을 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요! 본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
![]() 핫 AI 도구![]() Undresser.AI Undress사실적인 누드 사진을 만들기 위한 AI 기반 앱 ![]() AI Clothes Remover사진에서 옷을 제거하는 온라인 AI 도구입니다. ![]() Undress AI Tool무료로 이미지를 벗다 ![]() Clothoff.ioAI 옷 제거제 ![]() AI Hentai GeneratorAI Hentai를 무료로 생성하십시오. ![]() 인기 기사
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
어 ass 신 크리드 그림자 : 조개 수수께끼 솔루션
2 몇 주 전
By DDD
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
![]() 뜨거운 도구![]() 메모장++7.3.1사용하기 쉬운 무료 코드 편집기 ![]() SublimeText3 중국어 버전중국어 버전, 사용하기 매우 쉽습니다. ![]() 스튜디오 13.0.1 보내기강력한 PHP 통합 개발 환경 ![]() 드림위버 CS6시각적 웹 개발 도구 ![]() SublimeText3 Mac 버전신 수준의 코드 편집 소프트웨어(SublimeText3) ![]() 뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?
![]() ![]()
Cakephp 튜토리얼
![]() ![]()
Steam의 계정 이름 형식은 무엇입니까?
![]() ![]()
Win11 활성화 키 영구
![]() ![]()
NYT 연결 힌트와 답변
![]() ![]() ![]() MySQL은 설치가 간단하고 강력하며 데이터를 쉽게 관리하기 쉽기 때문에 초보자에게 적합합니다. 1. 다양한 운영 체제에 적합한 간단한 설치 및 구성. 2. 데이터베이스 및 테이블 작성, 삽입, 쿼리, 업데이트 및 삭제와 같은 기본 작업을 지원합니다. 3. 조인 작업 및 하위 쿼리와 같은 고급 기능을 제공합니다. 4. 인덱싱, 쿼리 최적화 및 테이블 파티셔닝을 통해 성능을 향상시킬 수 있습니다. 5. 데이터 보안 및 일관성을 보장하기위한 지원 백업, 복구 및 보안 조치. ![]() Navicat 자체는 데이터베이스 비밀번호를 저장하지 않으며 암호화 된 암호 만 검색 할 수 있습니다. 솔루션 : 1. 비밀번호 관리자를 확인하십시오. 2. Navicat의 "비밀번호 기억"기능을 확인하십시오. 3. 데이터베이스 비밀번호를 재설정합니다. 4. 데이터베이스 관리자에게 문의하십시오. ![]() Navicat Premium을 사용하여 데이터베이스 생성 : 데이터베이스 서버에 연결하고 연결 매개 변수를 입력하십시오. 서버를 마우스 오른쪽 버튼으로 클릭하고 데이터베이스 생성을 선택하십시오. 새 데이터베이스의 이름과 지정된 문자 세트 및 Collation의 이름을 입력하십시오. 새 데이터베이스에 연결하고 객체 브라우저에서 테이블을 만듭니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 데이터 삽입을 선택하여 데이터를 삽입하십시오. ![]() MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오. ![]() MariaDB 용 Navicat은 암호가 암호화 된 양식으로 저장되므로 데이터베이스 비밀번호를 직접 볼 수 없습니다. 데이터베이스 보안을 보장하려면 비밀번호를 재설정하는 세 가지 방법이 있습니다. Navicat을 통해 비밀번호를 재설정하고 복잡한 비밀번호를 설정하십시오. 구성 파일을 봅니다 (권장되지 않음, 위험이 높음). 시스템 명령 줄 도구를 사용하십시오 (권장되지 않으면 명령 줄 도구에 능숙해야 함). ![]() 응용 프로그램을 열고 새로운 연결 (Ctrl n)을 선택하여 Navicat에서 새로운 MySQL 연결을 만들 수 있습니다. "MySQL"을 연결 유형으로 선택하십시오. 호스트 이름/IP 주소, 포트, 사용자 이름 및 비밀번호를 입력하십시오. (선택 사항) 고급 옵션을 구성합니다. 연결을 저장하고 연결 이름을 입력하십시오. ![]() MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다. ![]() Navicat에서 SQL을 수행하는 단계 : 데이터베이스에 연결하십시오. SQL 편집기 창을 만듭니다. SQL 쿼리 또는 스크립트를 작성하십시오. 실행 버튼을 클릭하여 쿼리 또는 스크립트를 실행하십시오. 결과를 봅니다 (쿼리가 실행 된 경우). ![]() |