初识MDL锁+数据库s锁和x锁

MDL锁从MySQL5.5开始引入,确保DDL和DML操作的一致性,分为读锁和写锁。onlineDDL自5.6版本起支持,在线执行DDL而不阻塞其他操作。s锁(共享锁/读锁)允许多个读取,但阻止写入;x锁(排他锁/写锁)允许读写,但阻止其他锁。所有DDL语句会导致事务隐式提交,无法回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

online DDL

1.s锁

2.x锁


        

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语句的事务将来没有办法回滚。

1.s锁

        英文为 shared lock,叫共享锁,我们也称为读锁,即 read lock。s锁之间是共享的,或者说是互不阻塞的。

        顾名思义,当事务读取一条记录时,需要先给该记录添加s锁,当另一条事务也要读取该记录时,一样可以继续给该条记录添加s锁,但是此时不能添加写锁,也就是x锁,只有前一个事务的s锁释放了,才能加上x锁。

2.x锁

        英文为exclusive lock,叫排他锁,我们也常称之为写锁,即write lock。x锁是具有排他性的,即一个写锁会阻塞其他的x锁和s锁

        当一个事务需要修改一条记录时,需要先获取改记录的x锁。当事务对一条记录加上了x锁,那么事务即可以读取该条事务也可以修改,而其他事务则不能该条记录再添加任何锁,直到x锁被释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海上生日朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值