MySQL学习(19):锁
1.什么是锁锁是盘算机调和多个历程或线程并发访问某一资源的机制。
在数据库中,数据是供很多用户共享的资源,数据库必须包管数据并发访问的划一性、有效性,这就要靠锁来调和实现。
MySOL中的锁,分为以下三类:
(1)全局锁:锁定命据库中的全部表
(2)表级锁:每次操纵锁住整张表
(3)行级锁:每次操纵锁住对应的行数据
2.全局锁
2.1全局锁的作用
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态(DML、DDL不可实行,DQL可实行)已经更新操纵的变乱提交语句都将被壅闭。
其典范的使用场景是做全库的逻辑备份,对全部的表举行锁定,包管数据的完备性、划一性。
数据库的备份是逐表举行的,大概刚刚完成了A表的备份,与A表相干的B表又更新了数据,造成了数据的差异等,因此备份前要加上全局锁
2.2实例备份
2.2.1使用全局锁的方法
(1)先辈入数据库,通过以下下令创建全局锁:
flush tables with read lock; (2)创建全局锁后,退出数据库,在windows或linux的下令行界面使用以下下令举行备份:
mysqldump -u登录数据库的用户 -p密码 数据库名>文件名
#-u与-p和后面的内容之间是没有空格的
#命令中的文件名,指的就是数据被复制后,存储到了这个文件里
#如果操作的不是本地数据库,而是远程连接的,那么就需要在命令里加上 -h 远程数据库ip (3)备份完成后,再进入数据库,输入以下下令解开全局锁:
unlock tables; 2.2.2倒霉用全局锁的方法
由于数据库中加全局锁是一个比力重的操纵,且存在以下标题:
(1)假如在主库上备份,那么在备份期间都不能实行更新,业务根本上就得停摆。
(2)假如在从库上备份,那么在备份期间从库不能实行主库同步过来的二进制日记(binlog),会导致主从延长
因此现实生产中要慎用全局锁。
在InnoDB引擎情况下,另有一种倒霉用全局锁实现划一性备份数据库的方法,只需在mysqldump下令里添加一个参数即可:
mysqldump --single-transaction -u登录数据库的用户 -p密码 数据库名>文件名
#注意--single-transaction没有空格
3.表级锁
表级锁,每次操纵锁住整张表。锁定粒度大,发生锁辩论的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。
对于表级锁,告急分为以下三类:
(1)表锁
(2)元数据锁(meta data lock,MDL)
(3)意向锁
3.1表锁
表锁分为两类:
(1)表共享读锁,简称读锁
(2)表独占写锁,简称写锁
实行锁操纵的会话其他会话读锁只可读(只能DQL,不能DML、DDL)只可读(只能DQL,不能DML、DDL)写锁可读可写(DQL、DML、DDL都可以)不可读不可写(DQL、DML、DDL都不可以)语法:
lock tables 表名 read或write;
#加锁
unlock tables;
#解锁,这条命令会解锁当前会话下的所有表锁 表锁是以会话为分界的,而不是以客户端为分界的,也不是以mysql用户为分界的。也就是说,在当前会话加了写锁,其他会话就无法读写(哪怕是同一客户端同一mysql用户)
3.2元数据锁
*元数据锁(MDL)是体系主动添加的,无需手动使用
*元数据锁是用来防止DML与DDL起辩论的
要明确元数据锁的作用,须要先回首一下变乱的4个隔离级别,此中mysql默认隔离级别Repeatable Read正是靠元数据锁来实现的
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZmExNDAxM2VhNGI2NGRiMTgyZjg3Nzg0MmNhMjZmMTQucG5n
元数据锁也有共享读锁与独占写锁,二者相互倾轧:
(1)当在一个变乱中对某个表举行增编削查(DQL、DML)时,体系会主动给这个表加上共享读锁。其他变乱可以对这个表举行增编削查,但不能修改表结构(DDL)
(2)当在一个变乱中对某个表举行了修改表结构,即DDL操纵(alter table ...),那么体系就会主动给这个表加上独占写锁,其他变乱既不可对该表举行增编削查(DQL、DML),也不可修改表结构(DDL)
变乱提交后,元数据锁会主动解开
3.3意向锁
对表举行DML操纵时,体系会临时给被操纵的数据行加上行锁,假如这时还要给该表加上表锁,就会造成行锁与表锁的辩论(即DML主动添加的行锁与表锁的辩论),为了办理这个辩论的标题,就须要使用意向锁。
简朴来说,意向锁是在举行DML操纵时与行锁一起添加的,有了意向锁后,再要添加表锁,体系就会先判定表锁与所添加的意向锁是否兼容,假如兼容则可以加表锁,否则就不可。
意向锁有2种:
(1)意向共享锁(IS)
可由以下语句添加:
select... lock in share mode IS与读锁(read)兼容,与写锁(write)互斥,也就是说,添加了IS后,可以对表加读锁,但不能加写锁
(2)意向排他锁(IX)
insert语句、update语句、delete语句会主动添加意向排他锁,select语句可由以下语句添加:
select...for update IX与读锁、写锁都互斥
3.4三种表级锁总结
是否是体系主动添加对表的作用一句话总结有啥用元数据锁是我对这张表举行增编削查时,你也可以举行增编削查,但你不能更改表结构(DDL)办理DDL与DML的辩论表锁读锁(read)否 我不能对表增编削(DML),只能查(DQL)。
你也一样。
就锁表用的,你用你就加,不消就不加 写锁
(write)
否 我可以对表增编削查。
你都不可以
意向锁意向共享锁(IS)否表可以加read,不能加write办理DML主动添加的行锁与表锁的辩论意向排他锁(IX)实行增编削时是主动,实行查时需手动添加表read、write都不能加
4.行级锁
*行级锁:每次操纵锁住对应的行数据。锁定粒度最小,发生锁辩论的概率最低,并发度最高。
*应用在InnoDB存储引擎中。
*由于InnoDB的数据是基于索引构造的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。
对于行级锁,告急分为以下三类:
(1)行锁(Record Lock):锁定单个行记录的锁,防止其他变乱对此行举行update和delete。在RC、RR变乱隔离级别下都支持
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvN2UzMGVjOTViNDMxNGRlZmEyN2M3YjQ1YjY4NjMzZTcucG5n
(2)间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙稳定,防止其他变乱在这个间隙举行insert,产生幻读。在RR变乱隔离级别下支持。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZjVmNDg1ZGI0MDI3NDFiODkwNGQ1MmMzNGE4OTcxNWEucG5n
(3)临键锁(Next-key Lock):行锁+间隙锁。在RR变乱隔离级别下支持。
4.1行锁
4.1.1共享锁与排他锁
InnoDB实现了以下2种行锁
(1)共享锁(S):其他变乱可以和当前变乱一起读一行带有S的数据。共享锁之间可兼容,但与排他锁互斥。
(2)排他锁(X):若某行数据被加上了排他锁,那么就只有当前变乱能操纵它,其他变乱不能编削,也不能查。排他锁之间也是互斥的
4.1.2加锁以及查察锁
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMGE4YjZiYmE2MjdiNDM2OTlkOGUzMzQ2YjQ5NTA3MGMucG5n
可以看到行锁的加锁情况与意向共享锁雷同,也就分析二者会同时添加。
不要忘了意向共享锁是为了办理行锁与表锁的辩论才设置的,因此二者才会同时添加
*通过下图语句可以查察体系内的锁,此中IS是意向共享锁,
S,REC_NOT_GAP是共享锁,S,GAP是间隙锁,S是临键锁
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZTVkZTA2NDBkOGRhNGZiNzk4MzgwOTQ2MTI0ZjBhYmIucG5n
4.1.3行锁主动升级为表锁的情况
InnoDB行锁是针对索引的锁,假如对没有索引的字段加行锁,那么行锁就会主动升级为表锁
比如在变乱A中修改a字段的数据(update),同时a字段没有索引,那么由于update操纵主动给这行数据添加了排他锁,同时由于a字段没有索引,这个排他锁主动升级为表锁,这个表的每一行数据就都要收到排他锁的限定,变乱B不能对这个表举行增编削查
4.2间隙锁与临键锁
RR隔离级别下差异索引在差异查询情况下的加锁范例:
非唯一索引范围查询临键锁等值查询查询的值存在临键锁+间隙锁查询的值不存在间隙锁唯一索引范围查询行锁+间隙锁等值查询查询的值存在行锁查询的值不存在间隙锁具体加锁过程可见如下毗连:
间隙锁详解https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvMDAzYTJjZTdlYjUwYzJlMjRhOGM2MjRjMjYwYzU5MzAucG5nhttps://blog.csdn.net/w15558056319/article/details/122861509?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172309730016800182785516%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=172309730016800182785516&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-23-122861509-null-null.142^v100^pc_search_result_base5&utm_term=%E9%97%B4%E9%9A%99%E9%94%81&spm=1018.2226.3001.4187
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
页:
[1]