ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL ---锁

2022-03-21 14:03:28  阅读:178  来源: 互联网

标签:事务 加锁 备份 --- 线程 MySQL DQL SHARED


 

 

 

 

 

 

 

 

 

 

 

 不加锁,数据备份

 

 

 出现数据不一致问题

 

 

 先锁住DB,利用系统提供的备份工具mysqldump 备份,期间只能操作DQL, DML 与DDL不能操作,备份结束产生xxx.sql文件,备份结束,解锁DB

 

 

相关命令

#加全局锁
flush tables with read lock;

#开始备份,在windows命令行中执行,不要在mysql环境里执行
mysqldump -h192.168.200.202 -uroot -p1234 itcast >D:/itcast.sql;

#解锁
unlock tables ;

 

 

 

 

备份成功之后,解锁

 

 

 

 

 

 上面的操作不用加全局锁

 

 

 

 

 

 读锁演示:

 

 

 客户端A给表加了读锁,不会阻碍其他客户端B的DQL操作,同时客户端A自己的DDL与DML也是无法操作的

 

 

 

 

 

 

 

 

 

 

 

 

在事务中查询与更新操作的时候,系统都会自动加入元数据对应的锁SHARED_READ与SHARED_WRITE,这两类锁都是兼容的,所以两个事务中DQL与DML都成功了

 

 

左边事务开启之后执行了DQL语句,系统自动加上了MDL的SHARED_READ, 右边执行DDL操作被阻塞,因为左边事务没有提交,右边的EXCLUSIVE与左边的SHARED_READ互斥,被阻塞。

左边提交事务之后,右边的阻塞解除,语句执行成功

 

 

 

 

 

 

 

 

 事务开启并不会出现新的锁,执行了相应的SQL语句之后才会出现对应锁

如DQL之后,出现SHARE_READ

 

 

 右边也开启事务,执行DML语句之后,出现 SHARED_WRITE

 

 

 如果没有意向锁,线程B需要在给表加锁前要检测表里数据的每一行是否加锁了(行锁)

 

 

 有了意向锁的情况,当线程A开启事务,对id=3这行数据做更新操作,会给这行加锁,同时给该表加意向锁,线程B想对表加锁的时候,会先去检测表的意向锁是否与自己要加的表锁兼容,兼容就直接加锁,不兼容则处于阻塞状态

当线程A提交事务之后,解锁,线程B拿到表锁

 

 

 

 

 

 

 

 

 

 

 

 左边查询语句加表锁,右边有查询到该表锁IS(意向共享锁)

 

 

 右边client给表也加一个读锁,也成功了

 

 给表加写锁被阻塞了,因为跟意向锁互斥

 

 左边提交事务,相关的行锁表锁都会释放,右边阻塞的写锁成功了

 

标签:事务,加锁,备份,---,线程,MySQL,DQL,SHARED
来源: https://www.cnblogs.com/saryli/p/16034355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有