select会不会加锁

  本人曾经参加过一次面试,被问到了select会不会加锁,当时我斩钉截铁的说,不加锁,因为有mvcc,当时我是觉得自己无比的正确

  不过今天刚好看到不错的文章,我知道了select会加锁,而且加的还是表级锁。

  表级锁?别担心,表级锁并不是表锁,而是meta lock元数据锁,元数据锁分为读锁和写锁,所有的dml都是读锁,而ddl才是写锁。

  知道了这个有什么好处吗?当然有了

  MDL锁是系统默认会加的,但却是你不能忽略的一个机制。比如下面这个例子,我经常看到有人掉到这个坑里:给一个小表加个字段,导致整个库挂了。

  

  我们可以看到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锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。

  现在你知道该如何安全的给表改结构了吗?那就是一定要等到很少有人在用的时候,高并发环境下真的会把mysql搞的down掉

posted on 2020-11-04 19:30  MaXianZhe  阅读(2714)  评论(0编辑  收藏  举报

导航