初识MDL锁

简介: 初识MDL锁

       MDL全称为 meta data lock,中文称作元数据锁,这是从MySQL5.5 开始引入的锁,MDL是为了解决DDL操作和DML操作之间的一致性。从锁的作用范围上来说,MDL算是一种表级锁,是一个server层的锁。

       出现场景:当我们通过alter 语句更新一张表的时候,同时又针对这张表执行了查询语句,假设两者同时执行,那么将来查询到的结果可能就不是我们想要的结果,也就是数据的一致性出了问题。

       为了解决这个问题,从MySQL5.5 开始推出了MDL。

       MDL加锁过程是系统自动控制,无法直接干预,也不需要直接干预,当我们对一个表做增删改查操作的时候,会自动加MDL读锁。当我们要更新表结构的时候,加MDL写锁。加读锁则所有线程可正常读表的元数据,并且读锁不影响表的增删改查操作,只是不能修改表的结构;而加写锁则只拥有锁的线程可以读写元数据,即只有拥有锁的线程才能更新表结构,其他线程不能修改表结构也不能执行相应的增删改查。

online DDL

       MySQL5.6开始引入了online DDL,顾名思义,从名字上就可以看出来是可以在线执行DDL,不和其他操作冲突,具体执行流程如下:

1.DDL(数据库表结构修改)操作需要首先获取MDL写锁。

2.接下来将MDL写锁降级成MDL读锁。

3.做DDL操作,也是最耗时的,但由于此时我们持有的是MDL读锁,因此并不会阻塞其他的增删改查操作。

4.做完DDL操作之后,接下来将MDL读锁升级成MDL写锁。

5.释放MDL锁

注:所有的DDL语句都会导致事务的隐式提交,也就意味着带有DDL语句的事务将来没有办法回滚。

相关文章
|
4月前
|
SQL 关系型数据库 MySQL
MySQL使用行级锁时,并非直接锁定记录,而是锁定涉及的索引。对于表`user_item`,更新语句先锁定非主键索引`idx_1`,再锁定主键索引。若两条更新语句分别按不同顺序锁定这两个索引,可能导致互相等待对方释放锁,引发死锁。解决方案包括先查询待更新记录的主键,再按主键更新,确保一致的锁定顺序。
46 2
|
4月前
|
SQL 关系型数据库 MySQL
临键锁引发的死锁
【8月更文挑战第4天】
44 0
临键锁引发的死锁
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
123 0
《锁》有那些?
锁是计算机科学中用于控制对共享资源的访问的一种同步机制。不同种类的锁适用于不同的场景和需求。下面是一些常见的锁的种类及其详细介绍:
83 1
|
存储 算法 安全
辛辛苦苦的劳动成果,如何上把锁?
辛辛苦苦的劳动成果,如何上把锁?
|
数据可视化 Java
lock锁和死锁
lock锁和死锁
共享锁(读锁)和排他锁(写锁)
共享锁(读锁)和排他锁(写锁)
208 0
|
SQL 监控 Oracle
【悲观锁/乐观锁/排它锁/共享锁/表级锁/行级锁/死锁】
【悲观锁/乐观锁/排它锁/共享锁/表级锁/行级锁/死锁】
123 0
|
存储 SQL NoSQL
mysql锁(全局锁、表锁、行锁、页锁、排他锁、共享锁)
mysql锁(全局锁、表锁、行锁、页锁、排他锁、共享锁)
387 0
|
SQL 关系型数据库 MySQL
数据库并发控制、悲观锁(Pessimistic Lock)、乐观锁(Optimistic Lock)、排他锁(Exclusivelocks X锁)、共享锁(Shared Lock S锁)
数据库并发控制、悲观锁(Pessimistic Lock)、乐观锁(Optimistic Lock)、排他锁(Exclusivelocks X锁)、共享锁(Shared Lock S锁)
数据库并发控制、悲观锁(Pessimistic Lock)、乐观锁(Optimistic Lock)、排他锁(Exclusivelocks X锁)、共享锁(Shared Lock S锁)

热门文章

最新文章