技术文摘
MySQL 多版本并发控制 MVCC 详细实例剖析
MySQL 多版本并发控制 MVCC 详细实例剖析
在数据库领域,多版本并发控制(MVCC)是一项极为重要的技术,MySQL 通过 MVCC 实现了高并发下的数据一致性和高性能。下面我们通过详细实例来深入剖析 MVCC。
假设有一个简单的数据库表 users,包含 id、name 字段。
开启事务 A,执行如下操作:
START TRANSACTION;
INSERT INTO users (id, name) VALUES (1, 'Alice');
此时,MySQL 为新插入的记录创建一个版本号,假设为 1。记录的隐藏字段会包含创建版本号和删除版本号(初始时删除版本号为 NULL)。
接着,开启事务 B:
START TRANSACTION;
SELECT * FROM users WHERE id = 1;
事务 B 会读取到事务 A 插入的记录,因为事务 B 的当前版本号小于记录的创建版本号(此时事务 A 未提交,版本号为 1,事务 B 版本号为当前系统版本号,假设为 2),并且删除版本号为 NULL,符合读取条件。
然后,事务 A 提交:
COMMIT;
现在,开启事务 C 进行更新操作:
START TRANSACTION;
UPDATE users SET name = 'Bob' WHERE id = 1;
MySQL 会为更新操作创建一个新的版本记录,版本号假设为 3。原来的记录删除版本号被设置为当前系统版本号(3),新记录的创建版本号为 3。
如果此时事务 B 再次执行查询:
SELECT * FROM users WHERE id = 1;
事务 B 仍然会读取到 name 为 Alice 的记录。这是因为事务 B 的版本号(2)小于新记录的创建版本号(3),并且小于旧记录的删除版本号(3),所以它只能看到旧版本的记录。
当事务 C 提交后,其他新开启的事务(版本号大于 3)在查询时就会读取到 name 为 Bob 的最新记录。
通过这个实例可以看到,MVCC 让不同事务在并发操作时,根据自身的版本号去读取合适版本的记录,避免了锁争用,提高了并发性能。它确保了数据的一致性,使得每个事务都能看到一个一致的数据库视图。在高并发场景下,MVCC 为 MySQL 数据库的高效稳定运行提供了坚实保障 。
- 网络畅通的关键:QoS 怎样实现差异化服务
- 如何实现多线程交替输出 A1B2C3D4...
- 腾讯客户端工程师赵裕:Web 平台中跨平台自渲染 UI 引擎的探索之路
- 自动化实践:全量 Json 对比于技改需求提效的应用
- 基建漫谈:你收获几何?
- WebStorm 2023.2 已正式发布
- 字节三面:高性能短链系统的设计之道
- JVM 优化之虚拟机栈与本地方法栈
- Intel AVX-512 指令集重获生机!小核心亦可运行
- 转转门店商详页异步编程实践探索
- 常见的五种服务器部署策略
- Emacs 打开 Git 仓库中多个子工程根目录的解决方案
- 美团面试官常考问题:你能否判断链表环?
- 你是否掌握了.Net 官方的 MSIL 工具?
- .NET 中 ChatGPT 的 Stream 传输实现方法