MySQL中的2PL两阶段锁协议

Posted 程序猿集锦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的2PL两阶段锁协议相关的知识,希望对你有一定的参考价值。

第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我


  • 背景

  • 准备实验环境

    • 建表语句

    • 初始化数据

    • 最终环境

  • 实验

    • 实验步骤

    • 实验截图

  • 总结

背景

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

MySQL中的2PL两阶段锁协议

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

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


准备实验环境

实验的前提条件:

  • RR可重复读事务隔离级别

  • MySQL的版本是5.7.24

  • 使用innodb存储引擎的表来测试


建表语句

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


CREATE TABLE `t` (
`id` int(11) NOT NULL,
`name` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


初始化数据

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


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


最终环境

最后准备的环境如下:

MySQL中的2PL两阶段锁协议




实验


实验步骤

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

  1. 开启一个左侧的事务。

  2. 开启一个右侧的事务。

  3. 在左侧事务中查询表t中的所有数据。

  4. 在右侧事务中查询表t中的所有数据。

  5. 在左侧事务中,获取id=3的数据行的X锁。

  6. 在左侧事务中,更新id=3的数据行内容。

  7. 在左侧事务中,查询更新后的id=3的数据行内容。

  8. 在左侧事务中,获取id=2的数据行的X锁。

  9. 在右侧事务中,尝试获取id=3的数据行的X锁,获取失败。


实验截图

实验的截图如下所示:

MySQL中的2PL两阶段锁协议

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

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


总结

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

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

第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我



以上是关于MySQL中的2PL两阶段锁协议的主要内容,如果未能解决你的问题,请参考以下文章

两段锁协议(Two-Phase Locking――2PL)

数据库的2PL两段锁协议与范式

MVCC Postgresql 和 MYSQL 到底谁更......?

MySQL 中的锁机制

MySQL 中的锁机制

MySQL 中的锁机制