MySQL의 잠금 메커니즘을 함께 철저하게 이해해 봅시다.
잠금은 MySQL의 매우 중요한 부분이며, 잠금은 MySQL의 데이터 액세스 동시성에 결정적인 영향을 미칩니다. 자물쇠에도 관련된 지식이 많기 때문에 마무리하고 뱃속까지 소화시키려면 몇 번이고 몇 번이고 진정하고 음미해야 한다. 이 문서는 잠금에 대한 일반적인 개요입니다. 관련 세부 정보를 보려면 계속해서 통합하려면 관련 서적을 찾아야 합니다.
관련 무료 학습 권장 사항: mysql 비디오 튜토리얼
잠금 이해
1.1 잠금 설명
计算机协调多个进程或线程并发访问某一资源的机制。
1.2 자물쇠의 중요성
在数据库中,除传统计算资源(CPU、RAM、I\O等)的争抢,数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性,有效性,是所有数据库必须要解决的问题。 锁冲突也是影响数据库并发访问性能的一个重要因素,因此锁对数据库尤其重要。
1.3 자물쇠의 단점
加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否已解除、释放锁等 ,都会增加系统的开销。
1.4 간단한 예
现如今网购已经特别普遍了,比如淘宝双十一活动,当天的人流量是千万及亿级别的,但商家的库存是有限的。 系统为了保证商家的商品库存不发生超卖现象,会对商品的库存进行锁控制。当有用户正在下单某款商品最后一件时, 系统会立马对该件商品进行锁定,防止其他用户也重复下单,直到支付动作完成才会释放(支付成功则立即减库存售罄,支付失败则立即释放)。
자물쇠의 종류
2.1 테이블 자물쇠
종류
读锁(read lock),也叫共享锁(shared lock) 针对同一份数据,多个读操作可以同时进行而不会互相影响(select)
写锁(write lock),也叫排他锁(exclusive lock) 当前操作没完成之前,会阻塞其它读和写操作(update、insert、delete)
스토리지 엔진 기본 잠금
MyISAM
Features
1. 对整张表加锁 2. 开销小 3. 加锁快 4. 无死锁 5. 锁粒度大,发生锁冲突概率大,并发性低
결론
1. 读锁会阻塞写操作,不会阻塞读操作 2. 写锁会阻塞读和写操作
Recommendations
MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎,因为写锁以后,其它线程不能做任何操作,大量的更新使查询很难得到锁,从而造成永远阻塞。
2.2 행 잠금
Types
rrree读锁(read lock),也叫共享锁(shared lock) 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁
写锁(write lock),也叫排他锁(exclusive lock) 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享锁和排他锁
意向共享锁(IS) 一个事务给一个数据行加共享锁时,必须先获得表的IS锁
스토리지 엔진 기본 잠금
意向排它锁(IX) 一个事务给一个数据行加排他锁时,必须先获得该表的IX锁
Features
InnoDB
문제 발생 트랜잭션 동시성별
1. 对一行数据加锁 2. 开销大 3. 加锁慢 4. 会出现死锁 5. 锁粒度小,发生锁冲突概率最低,并发性高
2.3 페이지 잠금
1. 更新丢失 解决:让事务变成串行操作,而不是并发的操作,即对每个事务开始---对读取记录加排他锁 2. 脏读 解决:隔离级别为Read uncommitted 3. 不可重读 解决:使用Next-Key Lock算法来避免 4. 幻读 解决:间隙锁(Gap Lock)
방법 잠그려고?
3.1 테이블 잠금
암시적 잠금(기본, 자동 잠금 및 자동 해제)
开销、加锁时间和锁粒度介于表锁和行锁之间,会出现死锁,并发处理能力一般(此锁不做多介绍)
select //上读锁
명시적 잠금(수동)
insert、update、delete //上写锁
잠금 해제(수동)
lock table tableName read;//读锁 lock table tableName write;//写锁
session01 | session 0 2 |
---|---|
테이블 잠금 교사 읽기; //읽기 잠금 | |
select * from Teacher; //정상적으로 읽을 수 있음 | select * from Teacher;//정상적으로 읽을 수 있음 |
교사 세트 업데이트 name = 3 where id =2;//오류가 보고되었으며 읽기 잠금으로 인해 쓸 수 없습니다 | update Teacher set name = 3 where id =2;//Blocked |
unlock tables;//Unlocked | |
update 교사 세트 이름 = 3 where id =2; //업데이트 작업 성공 |
session01 | session02 |
---|---|
lock table Teacher write;/ /쓰기 잠금 켜기 | |
select * from Teacher; //정상적으로 읽을 수 있음 | select * from Teacher;//Blocked |
update 교사 세트 이름 = 3, 여기서 ID = 2;// 정상적으로 업데이트 가능 | update 교사 세트 이름 = 4 여기서 id =2;//차단됨 |
테이블 잠금 해제;//Unlock | |
선생님에게서 * 선택;//읽기 성공 | |
update Teacher set name = 4 where id =2; //업데이트 작업 성공 |
3.2 행 잠금
암시적 잠금(기본값, 자동 잠김 및 자동 해제)
unlock tables;//所有锁表
select //不会上锁
명시적 잠금(수동)
insert、update、delete //上写锁
잠금 해제(수동)
select * from tableName lock in share mode;//读锁 select * from tableName for update;//写锁
session01 | session02 |
---|---|
begin; |
|
select * from Teacher where id = 2 공유 모드 잠금;// 읽기 잠금 |
|
select * from Teacher where id = 2;//정상적으로 읽을 수 있음 | |
update 교사 세트 이름 = 3 where id =2 ;//업데이트 작업 가능 | update 교사 세트 이름 = 5 where id =2; //Blocked |
commit; | |
update 교사 세트 이름 = 5 where id =2 //업데이트 작업 성공 |
session0 1 | session02 |
---|---|
begin; | |
select * 교사 업데이트의 경우 id = 2; //write lock | |
select * ID = 2인 교사로부터 ;//정상적으로 읽을 수 있음 | |
update 교사 세트 이름 = 3 where id =2;//업데이트 가능 | update 교사 세트 이름 = 5 where id =2;//Blocked |
rollback; | |
업데이트 교사 세트 이름 = 5 여기서 ID =2;//업데이트 작업 성공 |
为什么上了写锁,别的事务还可以读操作? 因为InnoDB有MVCC机制(多版本并发控制),可以使用快照读,而不会被阻塞。
行锁的实现算法
4.1 Record Lock锁
单个行记录上的锁 Record Lock总是会去锁住索引记录,如果InnoDB存储引擎表建立的时候没有设置任何一个索引,这时InnoDB存储引擎会使用隐式的主键来进行锁定
4.2 Gap Lock锁
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引加锁,对于键值在条件范围内但并不存在的记录。 优点:解决了事务并发的幻读问题 不足:因为query执行过程中通过范围查找的话,他会锁定争个范围内所有的索引键值,即使这个键值并不存在。 间隙锁有一个致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成锁定的时候无法插入锁定键值范围内任何数据。在某些场景下这可能会对性能造成很大的危害。
4.3 Next-key Lock锁
同时锁住数据+间隙锁 在Repeatable Read隔离级别下,Next-key Lock 算法是默认的行记录锁定算法。
4.4 行锁的注意点
1. 只有通过索引条件检索数据时,InnoDB才会使用行级锁,否则会使用表级锁(索引失效,行锁变表锁) 2. 即使是访问不同行的记录,如果使用的是相同的索引键,会发生锁冲突 3. 如果数据表建有多个索引时,可以通过不同的索引锁定不同的行
如何排查锁?
5.1 表锁
查看表锁情况
show open tables;
表锁分析
show status like 'table%';
1. table_locks_waited 出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次值加1),此值高说明存在着较严重的表级锁争用情况 2. table_locks_immediate 产生表级锁定次数,不是可以立即获取锁的查询次数,每立即获取锁加1
5.2 行锁
行锁分析
show status like 'innodb_row_lock%';
1. innodb_row_lock_current_waits //当前正在等待锁定的数量 2. innodb_row_lock_time //从系统启动到现在锁定总时间长度 3. innodb_row_lock_time_avg //每次等待所花平均时间 4. innodb_row_lock_time_max //从系统启动到现在等待最长的一次所花时间 5. innodb_row_lock_waits //系统启动后到现在总共等待的次数
information_schema库
1. innodb_lock_waits表 2. innodb_locks表 3. innodb_trx表
优化建议
1. 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁 2. 合理设计索引,尽量缩小锁的范围 3. 尽可能较少检索条件,避免间隙锁 4. 尽量控制事务大小,减少锁定资源量和时间长度 5. 尽可能低级别事务隔离
死锁
6.1 解释
指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象
6.2 产生的条件
1. 互斥条件:一个资源每次只能被一个进程使用 2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放 3. 不剥夺条件:进程已获得的资源,在没有使用完之前,不能强行剥夺 4. 循环等待条件:多个进程之间形成的一种互相循环等待的资源的关系
6.1 解决
1. 查看死锁:show engine innodb status \G 2. 自动检测机制,超时自动回滚代价较小的事务(innodb_lock_wait_timeout 默认50s) 3. 人为解决,kill阻塞进程(show processlist) 4. wait for graph 等待图(主动检测)
6.1 如何避免
1. 加锁顺序一致,尽可能一次性锁定所需的数据行 2. 尽量基于primary(主键)或unique key更新数据 3. 单次操作数据量不宜过多,涉及表尽量少 4. 减少表上索引,减少锁定资源 5. 尽量使用较低的隔离级别 6. 尽量使用相同条件访问数据,这样可以避免间隙锁对并发的插入影响 7. 精心设计索引,尽量使用索引访问数据 8. 借助相关工具:pt-deadlock-logger
乐观锁与悲观锁
7.1 悲观锁
解释
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
实现机制
表锁、行锁等
实现层面
数据库本身
适用场景
并发量大
7.2 乐观锁
解释
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性
实现机制
提交更新时检查版本号或者时间戳是否符合
实现层面
业务代码
适用场景
并发量小
更多相关免费学习推荐:mysql教程(视频)
위 내용은 MySQL의 잠금 메커니즘을 함께 철저하게 이해해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템으로, 주로 데이터를 신속하고 안정적으로 저장하고 검색하는 데 사용됩니다. 작업 원칙에는 클라이언트 요청, 쿼리 해상도, 쿼리 실행 및 반환 결과가 포함됩니다. 사용의 예로는 테이블 작성, 데이터 삽입 및 쿼리 및 조인 작업과 같은 고급 기능이 포함됩니다. 일반적인 오류에는 SQL 구문, 데이터 유형 및 권한이 포함되며 최적화 제안에는 인덱스 사용, 최적화 된 쿼리 및 테이블 분할이 포함됩니다.

MySQL은 성능, 신뢰성, 사용 편의성 및 커뮤니티 지원을 위해 선택됩니다. 1.MYSQL은 효율적인 데이터 저장 및 검색 기능을 제공하여 여러 데이터 유형 및 고급 쿼리 작업을 지원합니다. 2. 고객-서버 아키텍처 및 다중 스토리지 엔진을 채택하여 트랜잭션 및 쿼리 최적화를 지원합니다. 3. 사용하기 쉽고 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 4. 강력한 지역 사회 지원을 받고 풍부한 자원과 솔루션을 제공합니다.

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

데이터베이스 및 프로그래밍에서 MySQL의 위치는 매우 중요합니다. 다양한 응용 프로그램 시나리오에서 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 웹, 모바일 및 엔터프라이즈 레벨 시스템을 지원하는 효율적인 데이터 저장, 조직 및 검색 기능을 제공합니다. 2) 클라이언트 서버 아키텍처를 사용하고 여러 스토리지 엔진 및 인덱스 최적화를 지원합니다. 3) 기본 사용에는 테이블 작성 및 데이터 삽입이 포함되며 고급 사용에는 다중 테이블 조인 및 복잡한 쿼리가 포함됩니다. 4) SQL 구문 오류 및 성능 문제와 같은 자주 묻는 질문은 설명 명령 및 느린 쿼리 로그를 통해 디버깅 할 수 있습니다. 5) 성능 최적화 방법에는 인덱스의 합리적인 사용, 최적화 된 쿼리 및 캐시 사용이 포함됩니다. 모범 사례에는 거래 사용 및 준비된 체계가 포함됩니다

백업 또는 트랜잭션 롤백 메커니즘이없는 한 데이터베이스에서 직접 삭제 된 행 복구는 일반적으로 불가능합니다. 키 포인트 : 거래 롤백 : 트랜잭션이 데이터를 복구하기 전에 롤백을 실행합니다. 백업 : 데이터베이스의 일반 백업을 사용하여 데이터를 신속하게 복원 할 수 있습니다. 데이터베이스 스냅 샷 : 데이터베이스의 읽기 전용 사본을 작성하고 데이터를 실수로 삭제 한 후 데이터를 복원 할 수 있습니다. 주의해서 삭제 명령문을 사용하십시오. 실수로 데이터를 삭제하지 않도록 조건을주의 깊게 점검하십시오. WHERE 절을 사용하십시오 : 삭제할 데이터를 명시 적으로 지정하십시오. 테스트 환경 사용 : 삭제 작업을 수행하기 전에 테스트하십시오.
