怎么算掌握了mysql_MySQL你必须掌握了解的锁知识!

一、前言

MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持行锁,所以文章介绍行锁会以InnoDB引擎为例来介绍。

二、全局锁

MySQL 提供全局锁来对整个数据库实例加锁。

语法:

FLUSH TABLES WITH READ LOCK

这条语句一般都是用来备份的,当执行这条语句后,数据库所有打开的表都会被关闭,并且使用全局读锁锁定数据库的所有表,同时,其他线程的更新语句(增删改),数据定义语句(建表,修改表结构)和更新类的事务提交都会被阻塞。

在mysql 8.0 以后,对于备份,mysql可以直接使用备份锁。

语句:

LOCK INSTANCE FOR BACKUP

UNLOCK INSTANCE

这个锁的作用范围更广,这个锁会阻止文件的创建,重命名,删除,包括 REPAIR TABLE TRUNCATE TABLE, OPTIMIZE TABLE操作以及账户的管理都会被阻塞。当然这些操作对于内存临时表来说是可以执行的,为什么内存表不受这些限制呢?因为内存表不需要备份,所以也就没必要满足这些条件。

三、表锁

Mysql的表级别锁分为两类,一类是元数据锁(Metadata Lock,MDL),一种是表锁。

元数据锁(MDL) 不需要显式使用,在访问一个表的时候会被自动加上。这个特性需要MySQL5.5版本以上才会支持,当对一个表做增删改查的时候,该表会被加MDL读锁;当对表做结构变更的时候,加MDL写锁。MDL锁有一些规则:

读锁之间不互斥,所以可以多线程多同一张表进行增删改查。

读写锁、写锁之间是互斥的,为了保证表结构变更的安全性,所以如果要多线程对同一个表加字段等表结构操作,就会变成串行化,需要进行锁等待。

MDL的写锁优先级比MDL读锁的优先级,但是可以设置max_write_lock_count系统变量来改变这种情况,当写锁请求超过这个变量设置的数后,MDL读锁的优先级会比MDL写锁的优先级高。(默认情况下,这个数字会很大,所以不用担心写锁的优先级下降)

MDL的锁释放必须要等到事务结束才会释放

所以我们在操作数据库表结构时候必须要注意不要使用长事务,这里具体是什么意思呢?我举个例子说明下:

Z7fY3y.png

上图表示演示了4个session执行语句,首先SessionA开启了事务没有提交,接着sessionB执行查询,因为是获取MDL读锁,所以互相不影响,可以正常执行,SessionC新增一个字段,由于MDL写和读是互斥的,所以SessionC会被阻塞,之后SessionD开始执行一个查询语句,由于SessionC的阻塞,所以SessionD也阻塞了。所以,我们模拟的SessionA的事务是长事务,然后后面执行了修改表结构,会导致后续对该表所有的读写操作都不可行了。所以在实际场景中,如果业务请求比较频繁的时候,对表结构进行修改的时候就有可能导致该库的线程被阻塞满。

表锁 的语法如下:

LOCK TABLES

tbl_name [[AS] alias] lock_type

[, tbl_name [[AS] alias] lock_type] ...

lock_type: {

READ [LOCAL]

| [LOW_PRIORITY] WRITE

}

UNLOCK TABLES

表锁分为读锁和写锁,读锁不互斥,但是获取读锁不能写入数据,其他没有获取到读锁的session也是可以读取表的,所以读锁的目的就是限制表被写。如果表被读锁锁住后,再执行插入语句会报错,报错如下:

1099 - Table 'XXXX' was locked with a READ lock and can't be updated

写锁被获取后可以对表进行读写,写锁是互斥的,一旦某个session获取到表的写锁,另外的session无法访问这个表,直到写锁被释放。

表的解锁可以使用unlock tables解锁,也可以客户端口自动解锁。lock tables锁表会独占式的锁住表,除了限制其他线程对该表的读写,也会限制本线程接下来的操作对象。

四、行锁(InnoDB)

MySQL的行锁是在引擎层面实现的,所以这里讨论的也是InnoDB引擎下的行锁,下面会详细介绍InnoDB下常见的几种行锁

4.1 共享锁

共享锁能允许事务获取到锁后进行读操作,共享锁是不互斥的,一个事务获取到共享锁后,另外一个事务也可以获取共享锁,获取共享锁后不能进行写操作。

4.2 排它锁

排他锁允许事务获取到锁后进行更新一行或者删除某一行操作,排他锁顾名思义是互斥的,一个事务获取到排他锁后,其他事务不能获取到排他锁,直到这个锁被释放。

4.3 意向锁

InnoDB支持多种粒度的锁,允许行锁和表锁共存,这里说的意向锁其实是一种表级别的锁,但是我把它放在行锁里面是因为它不会单独存在,它的出现肯定会伴随着行锁(共享锁或者排他锁),它主要的目的就是表示将要锁定表中的行或者正在锁定表中的行。

意向锁根据和行锁的组合可以分为:

意向排他锁:表明将要在表中的某些行获取排他锁

意向共享锁:表明将要在表中的某些行获取共享锁

意向锁的获取必须在行锁获取之前,也就是说获取共享锁之前必须先要获取共享意向锁,对于排他锁也是一样的道理。

那么这个意向锁到底有什么作用呢?

解释这个之前,我们先看看意向锁和行锁之前的兼容关系:

排他锁(X)

意向排他锁(IX)

共享锁(S)

意向共享锁(IS)

排他锁(X)

冲突

冲突

冲突

冲突

意向排他锁(IX)

冲突

兼容

冲突

兼容

共享锁(S)

冲突

冲突

兼容

兼容

意向共享锁(IS)

冲突

兼容

兼容

兼容

我们假设有2个事务A和事务B,事务获取到了共享锁,锁住了表中的某一行,这一行只能读,不能写,现在事务B要申请整个表的写锁。如果事务B申请成功,那么肯定是可以对表中所有的行进行写操作的,那么肯定与A获取的行锁冲突。数据库为了避免这种冲突,就会进行冲突检测,那么如何去检测呢?有两种方式:

判断表是否已经被其他事务用表级锁锁住。

判断表中的每一行是否被行锁锁住。

判断表中的每一行需要遍历所有记录,效率太差,所以数据库就用第一种方式去做冲突检测,也就是用到了意向锁。

总结

本文主要从MySQL的加锁范围来分析了MySQL的锁,MySQL根据加锁范围可以分为全局锁、表锁、行锁。全局锁和表锁是MySQL自己实现,行锁都是由引擎层面去实现。InnoDB下的行锁主要分为共享锁和排他锁。共享锁请求后,行只能读,共享锁之间不互斥。排他锁获取后能更新和删除行,排他锁与其他锁都互斥。最后我在行锁的基础上提到了意向锁,意向锁主要表示正在锁住行或者即将锁住行,为了在锁冲突检测中提高效率。当然InnoDB下还有其他锁,比如间隙锁,记录锁,Next-Key锁等,这些都不在本文的探讨范围之内,如有兴趣的同学可以自行研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我学机械的可以转嵌入式吗?

▼点击下方名片,关注公众号▼编排 | strongerHuang微信公众号 | 嵌入式专栏前几天,有读者在后台问,他是一个机械专业的学生,想转到嵌入式方向,问我有没有必要转?如果转嵌入式该怎么学?今天我们特…

入门物联网还得靠嵌入式

小米在十一周年的发布会上,展示了一个新产品:CyberDog仿生四足机器人“铁蛋”,继腾讯X实验室的四足机器人MAX后,小米也开始跨界入局尝试研制机器狗。2020年国家会议召开,加快推动新基建建设,各产业进行数字…

mysql中定时任务_mysql中定时任务的用法

1.什么是事件一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行;mqsql的事件类似于linux的定时任务,不过是完全在m…

一文看懂 | 内存交换机制

本文基于 Linux-2.4.16 内核版本由于计算机的物理内存是有限的, 而进程对内存的使用是不确定的, 所以物理内存总有用完的可能性. 那么当系统的物理内存不足时, Linux内核使用什么方案来避免申请不到物理内存这个问题呢?相对于内存来说, 磁盘的容量是非常大的, 所以Linux内核实…

无论是cisco还是华三的书上对于子网划分有个问题需要解释

无论是cisco还是华三的书上对于子网划分有个问题,例如:如果子网为有五位 ,则可以划分为30个子网。在实际中却不是这样的 子网位五位,可以划分为32个子网。那为什么这么写,难道是出书的人写错了,其实不是。这…

mysql online ddl 5.6_MySQL 5.6的Online DDL功能测试

online DDL的前身是 innodb fast index creation(5.1和5.5), 5.6里对这个功能做了扩展:很多alter table的操作绕开了 table copying,支持DML并发操作。一、online ddl的支持测试:1、主键的增删主键添加:支持online ddl&#xff0c…

Stupid cat Doge (分形图)

【题目描述】 【题目链接】 http://noi.openjudge.cn/ch0204/8463/ 【算法】 为求等级N下的点的坐标可由几何关系找到其与等级N-1下对应点的关系&#xff0c;然后递归直至所有点的祖先&#xff08;等级0&#xff09;即可计算出坐标。 【代码】 1 #include <bits/stdc.h>2…

电赛时,如何快速搭建电路?

大家好&#xff0c;我是张巧龙&#xff0c;电赛只有四天三夜&#xff0c;电路方案可能需要多次验证&#xff0c;有的同学选择直接洞洞板焊接&#xff0c;自行跳线。有些同学可能会选择雕刻机雕刻。我带的学生一般会使用传统工艺-腐蚀法&#xff0c;这种方法的优点&#xff0c;成…

Javaweb经典三层架构的演变

1.Javaweb经历了三个时期 ①JSP Model1第一代 JSP Model1是JavaWeb早期的模型&#xff0c;它适合小型Web项目&#xff0c;开发成本低&#xff01;Model1第一代时期&#xff0c;服务器端只有JSP页面&#xff0c;所有的操作都在JSP页面中&#xff0c;连访问数据库的API也在JSP页面…

我决定去读研了

读书这个事情&#xff0c;我一直都是比较推荐大家去做的&#xff0c;今天有一位同学找到我&#xff0c;问我现在哪个行业比较赚钱&#xff0c;自己马上要毕业了&#xff0c;想马上大显身手一下。然后我问他&#xff0c;你有没有赚钱的压力&#xff0c;还有自己目前的学习成绩怎…

win2008 php mysql zend phpmyadmin_Windows2008 最新版Apache2.PHP5.MySQL6.PHPMyadmin.ZendOptimizer安装图解...

首先到PHPCHINA的网站www.phpchina.com下载最新的正式版本Apache 2.2.8地址&#xff1a;http://apache.mirror.phpchina.com/httpd/httpd-2.2.8-win32-src.zipPHP-5.2.5地址&#xff1a;http://cn.php.net/get/php-5.2.5-Win32.zip/from/this/mirrorMySQL-6.0.3-alpha-win32地址…

WPF 开源项目 【watcher】 守望者,一款监控,统计,分析你每天在自己电脑上究竟干了什么的软件...

时隔多年&#xff08;两年&#xff09;&#xff0c;天天沉迷写PHP的我在连续加薪了逐渐发现自己不怎么写代码了。 甚至有一天我发现我连IDE 都没有打开&#xff0c;实在是太堕落了 为了及时悬崖勒马&#xff0c;回头是岸。为了鼓励自己专心写代码&#xff0c;我决定写一款监控自…

Java iText PDF:用 iText 包生成简单的 pdf 文件

有点兴趣想要看看 Java 怎么生成 PDF 文件&#xff0c;搜索了一下&#xff0c;据说 iText 包比较好&#xff0c;到 这里下载 iText.jar 包&#xff0c;顺便把源代码、文档都一起下载了吧。但是&#xff0c;仅仅有这么一些材料想要写代码生成 pdf 文件还是比较困难的&#xff0c…

java互换_两个变量交换的四种方法(Java)

对于两种变量的交换,我发现四种方法,下面我用Java来演示一下。 1.利用第三个变量交换数值,简单的方法。 (代码演示一下) 1 class TestEV 2 //创建一个类 3 {4 public static void main(String[]args) 5 {6 int x =5,y=10; //定义两个变量 7 8 int temp = x;    //定义第…

搞技术的,越老越吃香?越老越值钱?

在我的整个职业生涯中&#xff0c;我目睹了很多才华横溢的工程师经过一段不太愉快的短期任职后离开了公司。曾经我也有这样的经历&#xff1a;在一家公司任职不到两年&#xff0c;就跳槽到了另一家&#xff0c;担任工程副总裁。撇开我的例子不谈&#xff0c;我认为出现这种现象…

ubuntu 修改host,以便在本地调试

sudo gedit /etc/hosts这样已经可以即可生效了&#xff0c;另外再改一下nginx.confserver_name localhost www.15-1688.com;

对存储还搞不清楚,先看看这篇文章-从51单片机上去理解存储器

存储器是许多存储单元的集合&#xff0c;存储器单元实际上是时序逻辑电路&#xff08;锁存器&#xff09;的一种&#xff0c;按单元号顺序排列。每个单元由若干二进制位构成&#xff0c;以表示存储单元中存放的数值&#xff0c;这种结构和数组的结构非常相似。按存储器的使用类…

继续泼冷水 Ubuntu决定放弃支持安腾

在今年早些时候微软宣布下一代windows server操作系统不再支持英特尔安腾架构&#xff0c;给本就前途堪忧的安腾泼了一盆冷水。如今Ubuntu&#xff08;重要的一款以桌面应用为主的Linux操作系统&#xff09;也决定不再支持英特尔安腾架构。而另一方面&#xff0c;安腾在硬件厂商…

给不起钱的大公司,算不上大公司

这是昨天给一位同学聊职业规划中说的一句话。这位同学在每次做选择前都会跟我聊下&#xff0c;感觉职业规划咨询跟卖菜差不多&#xff0c;那些觉得我的建议不错的同学&#xff0c;总是会在一年两年后继续找我&#xff0c;挺好的&#xff0c;喜欢跟大家一起沟通吹水并一起成长的…

粉丝回馈,8000元大礼包免费相送

9月开学季&#xff0c;福利送不停&#xff0c;果哥又给大家送福利了&#xff0c;价值8000元豪礼相送&#xff01;一、 前言非常感谢大家对我公众号的支持&#xff0c;暑假也结束了。这次邀请了3个不错的公众号朋友&#xff0c;同时也是电子嵌入式领域的优质公众号&#xff0c;一…