你了解MySQL中的锁吗?
MySQL中的锁,分为全局锁、表级锁、行锁
全局锁
全局锁的意思就是,对整个数据库实例加锁,它的命令是FTWRL
Flash tables with read lock
这个命令的语义是,使整个库处于一种只读的状态,使用这个命令后,以下语句会被阻塞:数据的更新、数据结构的定义、更新类事务的提交。
全局锁通常被用于全库逻辑备份,但是让整个库只读,会有两个问题:
- 主库上的备份,会使整个业务停摆。
- 从库上的备份,会造成备份期间,从库无法执行主库同步过来的bin log而造成主从延迟。
官方自带的逻辑是mysqldump,导数据之前,会开启一个事务,目的是拿到一致性视图,由于MVCC(数据多版本并发控制),备份的过程中,数据是可以正常更新的。但是由于只有InnoDB支持事务,所以只有InnoDB可以使用mysqldump来对数据库进行逻辑备份。这也是为什么现在都建议使用InnoDB的原因之一。
表级锁
MySQL里面的表级锁有两种,一种是表锁,一种是MDL元数据锁。(Meta data lock)
表锁的语法是:
lock tables ...read/write
整张表上锁,不仅限制其他线程的操作,同时也限制本线程的操作。
MDL是一种隐式锁。他的所用是保证读写操作的正确性,MDL是MySQL5.5版本之后引入的,当对一个表进行增删改查的时候,会加MDL读锁。对表结构进行修改的时候,会加MDL写锁。读写锁之间、写锁之间是互斥的。(所以写锁也叫排它锁,读锁也叫共享锁)。
锁只有在事务提交的时候,才会释放。所以长事务会一致占用锁。所以修改表结构的时候,要注意,不要阻塞线上正在执行的增删改查操作。
行锁
行锁是存储引擎层实现的,所以这也是为什么要用InnoDB引擎来代替MyISAM引擎的原因之一。
有两个事务都在更改同一条热点数据。这个时候,会出现阻塞现象。
在InnoDB引擎中,行锁是需要的时候加上的,但是释放锁的时候,却是事务结束的时候才释放。所以如果一个事务要锁多个行,要把最可能造成锁冲突的语句放到后面,这样可以减少阻塞的时间。
死锁和死锁检测
并发系统中,不同线程出现循环依赖资源,涉及到的线程都在等待其他线程释放资源,导致无限等待的状态,称为死锁。
有两种思路可以解决死锁问题:
- 设置超时等待,innodb_lock_wait_timeout,默认是50s,显然这个时间太长了,但是这个值的大小很难确定,会误伤正常的锁等待。
- 发起死锁检测,发生死锁后,主动回滚死锁链条中的某一事务,让其他事务可以正常执行。参数是innodb_deadlock_detect
但是死锁检测是需要额外负担的,我们可以做并发控制,减少共享资源的争抢。
你了解MySQL中的锁吗?的更多相关文章
- MySQL系列(五)---总结MySQL中的锁
MySQL中的锁 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 MySQL系列(四):引擎 概述 MyISAM支持表锁,InnoDB支持 ...
- MySQL中InnoDB锁不住表的原因
MySQL中InnoDB锁不住表是因为如下两个参数的设置: mysql> show variables like '%timeout%'; +-------------------------- ...
- MySQL中的锁、隔离等级和读场景
一.导言 关于MySQL中的锁还有隔离等级这类话题,其概念性的解释早已泛滥.记住其概念,算不上什么.更重要的是思考:他们的区别和联系在哪儿,为什么会有这样的概念. 1)MySQL的锁(Lock)分为行 ...
- MySQL实战 | 06/07 简单说说MySQL中的锁
原文链接:MySQL实战 | 06/07 简单说说MySQL中的锁 本文思维导图:https://mubu.com/doc/AOa-5t-IsG 锁是计算机协调多个进程或纯线程并发访问某一资源的机制. ...
- mysql中的锁表语句查看方法汇总
mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Val ...
- 谈谈MySQL中的锁
谈谈MySQL中的锁 锁的定义 在生活中锁的例子就非常多了,所以应该很容易理解锁的含义.在计算机领域,可以这样来概述,锁是计算机协调多个进行进程并发访问某一资源的机制. 在数据库中,锁也是一个 ...
- MySQL中的锁(表锁、行锁)
锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...
- mysql中的锁
MYSQL不同的存储引擎支持不同的锁的机制 MyISAM 支持表锁,InnoDB支持表锁和行锁 表锁,行锁比较 表锁:开销小,加锁快:不会出现死锁:锁定力度大,发生锁冲突概率高,并发度最低 行锁:开销 ...
- Mysql中的锁机制
原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如 ...
随机推荐
- JDK1.7中HashMap死环问题及JDK1.8中对HashMap的优化源码详解
一.JDK1.7中HashMap扩容死锁问题 我们首先来看一下JDK1.7中put方法的源码 我们打开addEntry方法如下,它会判断数组当前容量是否已经超过的阈值,例如假设当前的数组容量是16,加 ...
- 基于STM32F429和HAL库的CAN收发例程
1.CAN协议介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议.在当前的汽车产业中,出于对安全性.舒适性.方便性.低公 ...
- 部署主从dns
主机部署:yum安装DNS服务和依赖 [admin@haifly-bj-dns1 ~]$ sudo yum install bind-chroot启动named-chroot服务 [admin@hai ...
- linux 基本操作积累
1 sed 命令,替换含有指定字符的一整行数据 sed -i 's/原字符串/替换后的字符串/g' ./文件名 (此命令会全局替换[整个文件内替换]原字符串) sed -i.bak 's/原字符串/替 ...
- 引入flask_cache时出现ModuleNotFoundError: No module named 'flask.ext'
环境: centos 7.3 python 3.6 flask 1.0.2 flask-cache 0.13.1 引入flask_cache后运行时,出现以下错误 Traceback (most re ...
- Sql 六种约束
--1.主键约束问题 create table 学生表( 学号 int primary key, 姓名 varchar(10)); insert into 学生表 values(null,'a');问 ...
- Oracle VM VirtualBOX桥接网卡
1.在VirtualBOX设置中的网络菜单,连接方式选择桥接网卡 2.启动系统,设置静态IP sudo vim /etc/network/interfaces auto enp0s3 ...
- .NET Core开发的iNeuOS物联网平台部署树霉派,从网关到云端整体解决方案。助力2019中国.NET峰会。
2019 中国.NET 开发者峰会正式启动 目 录 1. 概述... 2 2. 树莓派硬件配置... 2 3. 软件信息... 3 4. Raspb ...
- windows下bower init 报错: bower ENOINT Register requires an interactive shell
windows下bower初始化时不应该在git bash中,而应该在cmd下打开的dos窗口中进行
- 实验吧之【Forms、天网管理系统】
Forms 原题链接 http://ctf5.shiyanbar.com/10/main.php Form 其实是个提示,代表html表单 F12 查看源码,发现 <input name=&qu ...