MySQL核心知识学习之路(4)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第四篇,总结了MySQL的锁相关知识。
上一篇:MySQL核心知识学习之路(3)
1 全局锁
所谓全局锁,就是对整个数据库实例加锁,其命令为:
mysql>flush tables with read lock;
以下该命令会简称为FTWRL。
释放全局锁的命令为:
mysql>unlock tables;
需要注意的是:一旦加上全局锁,数据更新、数据定义和更新类事务都会被阻塞!
典型使用场景:全库的逻辑备份
对于全部库都是InnoDB引擎的库的话,建议使用 -single-transaction 参数,它对应用更友好。因为它基于MVCC(多版本并发控制)的支持,有自己的一致性视图,在整个过程中数据支持正常更新。
不建议使用 set global readonly = true 的方式实现全库只读,因为:
(1)修改global变量的影响面更大,某些系统可能会采用readonly作为业务参数使用。
(2)在异常处理机制上有所差异:
通过global方式之后如果客户端异常,数据库会一直保持readonly状态,会导致整个库长时间处于不可写状态,风险较高。
而FTWRL方式下,MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态。
2 表级锁
MySQL中表级锁有两类:一是表锁,二是元数据锁。
表锁
表锁的语法为:lock tables ... read/write
它限制了别的线程,也限定了本线程接下来的操作对象。
表锁一般是在数据库引擎不支持行锁的时候才会被用到:
比如还在用MyISAM引擎,它不支持事务,需要安排升级引擎;
比如引擎支持事务了,但代码还没升级,将lock/unlock tables换为begin和commit;
元数据锁(metadata lock, MDL)
MySQL 5.5引入了MDL,不需要显示使用,在访问一个表的时候会自动被加上。
当对一个表做增删改查时,自动加MDL读锁(读锁之间不互斥);
当对一个表做表结构变更时,自动加MDL写锁(读写锁与写锁之间互斥);
MDL的作用:保证读写的正确性。
MDL带来的问题:修改表结构时申请MDL写锁,可能会导致锁表,后续业务操作均会阻塞。
解决办法:安全地给小表加字段。
解决长事务:找到一直占用MDL锁的长事务并kill掉;
设定等待时间:在alter table语句中设定等待时间,超时则释放,不阻塞后续业务语句的执行;
3 行锁
在MySQL中,行锁是引擎层由各个引擎自己实现的,但并不是所有引擎都支持行锁例如MyISAM就不支持。
事务A更新了一行,这时事务B也要更新同一行,那么事务B需要等待事务A的操作完成后才能进行
两阶段锁
两阶段锁协议:在InnoDB的事务中,行锁是在需要的时候才加上的,但并不是不需要了就立即释放,而是要等到整个事务结束时才释放。
给我们的启示:如果事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。
案例:电影票在线交易业务
假设这个业务涉及三个操作:从顾客 A 账户余额中扣除电影票价;给影院 B 的账户余额增加这张电影票价;记录一条交易日志。
相比较下,影院B的账户更容易引发并发度冲突,所以应该把第二条语句放在事务内的最后一条,比如3-1-2的顺序,那么影院账户余额这一行的锁时间就最少。
4 死锁
所谓死锁,就是指当并发系统中不同线程出现循环资源依赖,各个线程都在等待其他线程释放资源时,就会导致各个线程进入无线等待的状态。

图片来源:林晓斌《MySQL实战45讲》
应对策略
(1)直接进入等待,直到超时。通过参数 innodb_lock_wait_timeout 来设置,默认50s。
(2)发起死锁检测,即主动检测是否出现死锁,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。
开启死锁检测:innodb_deadlock_detect=on。
但是,主动检测死锁存在额外负担:当并发线程数量巨大时,需要消耗大量CPU资源去做检测,降低了事务执行效率。
那么,如何优化?一方面,可以临时关闭死锁检测(头痛医头的方法,不推荐);另一方面,控制并发度(可以做客户端并发控制,也可以做数据库服务端并发控制,但需要MySQL专家能够修改MySQL源码)。
5 小结
本文总结了MySQL的锁的相关知识,包括全局锁、表级锁(表锁和元数据锁)及行锁,最后了解了死锁的产生及应对策略。
参考资料
林晓斌(丁奇),《MySQL实战45讲》
扫码订阅《MySQL实战45讲》


MySQL核心知识学习之路(4)的更多相关文章
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...
- MySQL索引知识学习笔记
目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...
- MYSQL+PHP的学习之路
MYSQL+PHP 先从MYSQL开始吧 第一步:SQL语句基础 1.书籍 2.网站: 这个网站在线测试和考试http://sqlzoo.net/wiki/SELECT_basics/zh 3.学习过 ...
- mysql 核心知识要点
整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理 ...
- MySQL核心知识
MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- MySQL学习之路(一)——初涉MySQL。
MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...
- Docker 与 K8S学习笔记(二)—— 容器核心知识梳理
本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...
- 阿里封神谈hadoop学习之路
阿里封神谈hadoop学习之路 封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...
- 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)
七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...
随机推荐
- 正则表达式--java进阶day06
1.正则表达式 2.正则表达式的规则.使用 3.字符类讲解 如图,单独一个a满足正则表达式的规则,所以返回true 当删去[]后,正则表达式中的规则就会变为必须是abc,否则不满足条件,即使有一个a ...
- "油猴脚本""篡改猴"领域的一些基本常识
本文简要介绍本人对"油猴脚本","篡改猴"领域的一些见解,内容注定不可能一步到位和事无巨细,欢迎各位仁人志士对我批评指正,提出意见建议.另外转载前请务必注明作者 ...
- 基于Docker+DeepSeek+Dify:搭建企业级本地私有化知识库超详细教程
在当今信息爆炸的时代,如何高效地管理和利用知识成为了企业竞争力的关键.为了帮助企业构建专属的知识库,本文将详细介绍如何使用Docker.DeepSeek和Dify来搭建一个企业级本地私有化知识库. 1 ...
- DAY1--ROS基本认知
1.ROS基本框架 ROS架构如下图所示,可以将其分为三个层次:OS层.中间层和应用层. 1.1 应用层 应用层是用户直接交互的部分,包含以下核心组件: Master: ROS的核心协调者,负责节点( ...
- dubbo源码解析-服务暴露与发现
一.概述 dubbo是一个简单易用的RPC框架,通过简单的提供者,消费者配置就能完成无感的网络调用.那么在dubbo中是如何将提供者的服务暴露出去,消费者又是如何获取到提供者相关信息的呢? 二.dub ...
- 使用搜索引擎时如何排除一些垃圾站点,比如csdn.net
使用搜索引擎时需要排除一些垃圾站点,比如csdn.net时,可以在关键词后面加上-site:csdn.net: stable diffusion docker部署TensorFlow 教程 -site ...
- K8s Pod 控制器介绍及应用示例
Kubernetes 官方文档:Pod 控制器 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kuber ...
- Hadoop和Spark大数据挖掘与实战
1.概述 本节将系统讲解大数据分析的完整流程,包括数据采集.预处理.存储管理.分析挖掘与结果可视化等核心环节.与此同时,我们还将对主流数据分析工具进行横向对比,帮助读者根据实际需求选用最合适的工具,提 ...
- Burp插件Fiora联动nuclei(windows)
大佬写的插件出来好久了 今天朋友问我Fiora联动nuclei,我突然忘了咋配的的了.. 记录一下 一.下载nuclei https://github.com/projectdiscovery/nuc ...
- 79.8K star!这款开源自动化神器让技术团队效率飙升,400+集成玩转AI工作流!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "n8n 是技术团队自动化领域的瑞士军刀,既能享受可视化搭建的便捷,又能随时插入代 ...