数据库全局锁 & 表锁
文章目录
一、全局锁
1. 含义
全局锁是给数据库定义一个读锁,使Insert, update, delete 以及DDL操作阻塞
2. 使用场景
为数据库,进行逻辑备份(导出数据库,生成一个SQL文件)
3. 语法
加锁: FLUSH TABLES WITH READ LOCK
解锁: UNLOCK TABLES
4. 注意事项
加锁注意事项:
- 该语法会导致数据库,全部只读,不能写。这种情况下业务几乎停滞!!!
- 且如果是读写分离,有一个库使用全局锁,会导致不能及时同步另外一个库的binlog,会导致两库数据不同步(主从延迟)
解锁则没什么注意事项,只有一点需要注意
- 在使用该命令过程中,如果客户端发生异常,那么MySQL会释放全局锁
4. 进行逻辑备份,避免注意事项出现方案
如果需要进行备份,建议使用mysql官方自带备份数据库工具,mysqldump备份。备份前在可重复读隔离级别下开启一个事务,就可以避免出现这些注意事项
该方案的命令如下:
mysqldump 参数 --single-transaction 数据库 > 导出文件
例如:mysqldump -h127.0.0.1 -uroot -p --single-transaction --default-character-set=utf8 databases > /temp/database.sql
然后输入数据库密码即可
使用该方案需要注意,该方案只适用于支持事务的引擎。
# 该命令可查看当前版本MySQL,支持哪些引擎,以及引擎是否支持事务等信息
SHOW ENGINES;
二、表级锁
1. 元数据锁(MDL: meta data lock)
1.1 含义
元数据锁,用来管理对数据库对象的并发访问,并确保数据一致性。元数据锁不会显示使用
MySQL5.5 引入,读锁共享,写锁互斥,读写锁之间互斥
1.2 场景
进行查询操作时,会隐式新增一个读锁,直到操作完成。
进行修改,新增,删除操作时,会隐式新增一个写锁,直到操作完成。
进行DDL(data definition language)操作时,会隐式新增一个写锁,直到操作完成
1.3 注意事项
多线程操作时,如果在查询的时候新增字段,容易导致数据库线程爆满
1.4 解决方案
1. 热点表,DDL 操作时增加延时等待操作(MySQL 8.0,MariaDB 支持该语法) 2. MySQL 的information_schema 库的 innodb_trx 表中,kill该(查询或者新增字段)事务2. 表锁
2.1 含义
加锁后,该线程只能读或读写该表,且该线程不能操作其它表。
如果是读锁,那其它线程也能读该表,但是写的操作会被阻塞。
如果是写锁,那么其他线程的所有操作将被阻塞。
2.2 场景
无使用场景,不适合运用在能使用颗粒度更小的INNODB引擎上,因为表锁只是减少了并发,INNODB建议使用行锁
更多行锁情况可以了解MySQL行锁(待更新中…)
2.3 语法
读锁:LOCK TABLES table_name… READ
写锁:LOCK TABLES table_name… WRITE
实例如下:
# 给table_name1加读锁,给table_name2加写锁
LOCK TABLES table_name1 READ, table_name2 WRITE;
# 解锁
UNLOCK TABLES;
总结
以上就是今天要讲的内容,本文仅仅简单介绍了全局锁,表级锁的使用,出现场景以及注意事项。 欢迎补充参考: