读锁之间不互斥,因此可以有多个线程同时对一张表增删改查 。读写之间、写锁之间是互斥的 , 用来保证变更表结构操作的安全性,如果有两个线程要同时给一个表加字段 , 其中一个要等另外一个执行完才能执行 。更改表结构要注意哪些?
给一个表加字段,或者修改字段, 或者加索引,需要扫描全表的数据 。在对大表操作的时候,你肯定会特别小心,以免对线上服务造成影响 。而实际上 , 即使是小表,操作不慎也会出问题,导致整个库的线程爆满 。
举个例子
我们来看一下下面的操作序列,假设表t是一个小表 。
image
session A先启动 , 这时候会对表t加一个 MDL读锁。由于session B需要的也是 MDL读锁 , 因此可以正常执行 。session C会被blocked, 是因为session A的MDL读锁还没有释放,而session C需要MDL写锁,因此只能被阻塞 , 读写锁互斥 。如果只有session C自己被阻塞还没什么关系 , 但是之后所有要在表t上新申请MDL读锁的请求也会被session C阻塞 。前面我们说了,所有对表的增删改查操作都需要先申请MDL读锁,就都被锁住 , 等于这个表现在完全不可读写了 。
如果某个表上的查询语句频繁, 而且客户端有重试机制,也就是说超时后会再起一个新session 再请求的话,这个 库的线程很快就会爆满。事务中的MDL锁,在语句执行开始时申请, 但是语句结束后并不会马上释放,而会等到整个事务提交后再释放 。
怎么解决这个 更改表结构问题
比较理想的机制是,在alter table语句里面设定等待时间, 如果在这个指定的等待时间里面能够拿到MDL写锁最好, 拿不到也不要阻塞后面的业务语句, 先放弃 。
ALTER TABLE tbl_name NOWAIT add column ... ALTER TABLE tbl_name WAIT N add column ...
【mysql怎么加全局锁 mysql 设置全局变量】关于mysql怎么加全局锁和mysql 设置全局变量的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 环境整治公众号美文怎么写,环境整治文案
- 关于如何用前端赠品引流的信息
- 关于葫芦娃游戏下载的信息
- 2012下载,拳皇2012下载
- 键盘监听器java代码的简单介绍
- 直播销售产品忌讳什么,网络直播卖产品有什么要求
- python禁用内置函数 python内置函数怎么用
- 740的显卡怎么样,gt740显卡怎么样
- flutter闲鱼导航栏,闲鱼用flutter如何热更新