mysql锁系列之表锁

基础材料:

centos7.5  mysql 5.7.24


mysql表级别的锁分为两类:表锁和元数据锁,两者的加锁形式上有所区别,元数据锁由系统自动隐式添加,而表锁需要手动显式操作。前篇文章已经写了关于元数据锁的一些内容,本篇主要对表锁进行说明。

对于MyISAM这种不支持事务的引擎来讲,支持的最小粒度的锁就是表锁。而innodb这种支持事务的引擎,在支持表锁的同时,还支持更细粒度的行锁。

表锁的优势在与不会因为加锁顺序不同而产生死锁,劣势在于一次性将表资源全部锁定并发度降低。

表锁显式语句加锁为共享锁(S)和排他锁(X),隐式DML操作加锁为意向共享锁(IS),意向排他锁(IX)。规则为意向兼容,读写互斥。


如何加表锁:

mysql> lock tables t1 read,t2 write;     #为表t1加读锁、t2加写锁,中间用逗号隔开。

如何释放表锁:

1、mysql>unlock tables;

2、session断开也会自动释放表锁

加表锁后的限制:

当前执行加锁命令的session只能按规则访问lock tables列表中的表,并且不能访问其他表。其他session能访问加读锁的表并且不能写,其他session不能访问加写锁的表。

以上面的命令为例,执行 lock tables t1 read,t2 write的session,只能读t1,读写t2,不能写t1,读写t1、t2外的其他表。如果尝试读写test表会返回错误信息:ERROR 1100 (HY000): Table 'test' was not locked with LOCK TABLES,告诉你test表不在你的锁定范围之列。


表锁实际也是由元数据锁控制实现的:

例如在一张表执行lock tables testok write; 观察metadata_locks结果如下:

与其他DDL语句一样,也要层层加锁,最终在表上加元数据排他锁,达到锁表的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值