MySQL 全局锁 & 表级锁

数据库全局锁 & 表锁



一、全局锁

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;

总结

以上就是今天要讲的内容,本文仅仅简单介绍了全局锁,表级锁的使用,出现场景以及注意事项。 欢迎补充

参考:

  1. 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
  2. 元数据锁定
  3. 表 锁定问题
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值