mysql两段锁协议_MySQL中的2PL两阶段锁协议

本文介绍了MySQL中的两阶段锁协议(2PL),通过实验详细解释了其工作原理。在可重复读事务隔离级别下,当一个事务获取锁后,即使已完成对该数据的操作,也会在事务提交或回滚后才释放锁,以确保数据一致性。
摘要由CSDN通过智能技术生成

关注我,获取更多分享。

你还不知道这个2PL是什么含义吗?看完下面的介绍,你就会豁然开朗。

背景

经常听到别人说2PL,猛的一听当时真的是一脸懵逼的感觉,啥意思?2PL是什么玩意?后来又听人说两阶段锁协议,这个又是什么?我咋没有听过呢?

c0fc2fc7f0d80788e7753cc5226292cf.png

后来才知这是MySQL中的一个术语:2PL(Two-phase locking),翻译成中文就是两阶段锁协议。

废话不多说,我们来用实际的例子体验一把。

准备实验环境

实验的前提条件:

RR可重复读事务隔离级别MySQL的版本是5.7.24使用innodb存储引擎的表来测试

建表语句

实验使用到的表结构如下所示:

CREATETABLE`t`(`id`int(11)NOTNULL,`name`varchar(16)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

初始化数据

此次实验中使用到的初始化数据如下所示:

insertinto t(id, name)values(1,'A');insertinto t(id, name)values(2,'B');insertinto t(id, name)values(3,'C');insertinto t(id, name)values(4,'D');

最终环境

最后准备的环境如下:

b80ac7b0838a9f2fc2460435331f4ed7.png

实验

实验步骤

我们来简单说一下实验的具体步骤:

开启一个左侧的事务。开启一个右侧的事务。在左侧事务中查询表t中的所有数据。在右侧事务中查询表t中的所有数据。在左侧事务中,获取id=3的数据行的X锁。在左侧事务中,更新id=3的数据行内容。在左侧事务中,查询更新后的id=3的数据行内容。在左侧事务中,获取id=2的数据行的X锁。在右侧事务中,尝试获取id=3的数据行的X锁,获取失败。实验截图

实验的截图如下所示:

dcbeadf7efc4c40b78163cb240ee2939.png

问题:为什么在第9步中,没有获取到id=3的数据行的X锁呢?按道理左侧的事务已经修改完成了id=3的数据行,它已经去获取了id=2的数据行的X锁了,id=3的竖行的X锁对它已经没有用了,为什么在右侧事务中仍然不能获取到id=3的数据行的X锁呢?

96fb4dcf3ce188ddf28d31b7e373efa5.png

答案:MySQL中的两阶段锁协议的工作机制就是这么设计的。

总结

在MySQL中,两阶段锁协议的含义是:当一个事务获取到了某一个数据库对象的锁之后,并不是当前事务不需要操作它了之后,这个说就会马上释放掉,这个锁会一直被这个事务持有,直到这个事务被提交或回滚后,这个锁才会被释放掉。所以,在当前事务还没有结束的时候,任何其他事务尝试获取这个锁的时候,都会被阻塞。知道当前事务提交或回滚后,前提事务才可以获取到这把锁。

这就是MySQL中2PL两阶段锁协议的含义。它在事务并发的时候,为数据的一致性提供有力的保障。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值