[MySQL]事务的MVCC原理与幻读
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[MySQL]事务的MVCC原理与幻读,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1589字,纯文字阅读大概需要3分钟。
内容图文
![[MySQL]事务的MVCC原理与幻读](/upload/InfoBanner/zyjiaocheng/864/cfe04d0968864893bcffb759b92e1d9b.jpg)
首先要了解MVCC,MVCC叫做多版本并发控制,实际上就是保存了数据在某个时间节点的快照。
我们每行数实际上隐藏了两列,创建版本号,过期(删除)版本号,每开始一个新的事务,版本号都会自动递增。
拿user表举例子,假设我们插入两条数据,他们实际上应该长这样 , 创建版本号是递增的。
id | name | create_version | delete_version |
---|---|---|---|
1 | 张三 | 1 | |
2 | 李四 | 2 |
这时候假设小明去执行查询,此时也是会默认开启一个事务 当前版本就是 current_version=3
select * from user where id<=3;
同时,小红在这时候开启事务去修改id=1的记录,小红事务版本是 current_version=4
update user set name='张三三' where id=1;
小红执行成功后的结果是这样的
id | name | create_version | delete_version |
---|---|---|---|
1 | 张三 | 1 | |
2 | 李四 | 2 | |
1 | 张三三 | 4 |
同时 , 还有小黑在删除id=2的数据,小黑的版本是 current_version=5,小黑执行后结果是这样的。
id | name | create_version | delete_version |
---|---|---|---|
1 | 张三 | 1 | |
2 | 李四 | 2 | 5 |
1 | 张三三 | 4 |
由于MVCC的原理是查找创建版本小于或等于当前事务版本,删除版本为空或者大于当前事务版本,小明的真实的查询应该是这样
select * from user where id<=3 and create_version<=3 and (delete_version>3 or delete_version is null);
所以小明最后查询到的id=1的名字还是'张三',并且id=2的记录也能查询到。这样做是为了保证事务读取的数据是在事务开始前就已经存在的,要么是事务自己插入或者修改的。
幻读是这样的 , 比如下面的增加用户的例子 ,假定用户名是唯一索引不允许重复
小明想要插入一条王五的数据 , 开启事务current_version=6查询名字为 '王五'的记录,发现不存在。
同时小红开启事务current_version=7插入一条 王五的数据,结果是这样:
id | Name | create_version | delete_version |
---|---|---|---|
1 | 张三 | 1 | |
2 | 李四 | 2 | |
3 | 王五 | 7 |
小明执行插入名字'王五'的记录,发现唯一索引冲突,无法插入,查询的时候分明看不到王五 , 但是插入总是说重复了 , 这就是幻读。
内容总结
以上是互联网集市为您收集整理的[MySQL]事务的MVCC原理与幻读全部内容,希望文章能够帮你解决[MySQL]事务的MVCC原理与幻读所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。