MySQL ---锁
2022/3/21 19:30:18
本文主要是介绍MySQL ---锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
不加锁,数据备份
出现数据不一致问题
先锁住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 ---锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享
- 2024-02-22docker mysql 5.7
- 2024-02-18从 20 多套 MySQL 到 1 套 TiDB丨骏伯网络综合运营管理平台应用实践
- 2024-02-07mysql 外键索引入门介绍,为什么工作中很少有人使用?