当前位置: 首页 > article >正文

快照读通过MVCC解决不可重复读当前读通过间隙锁解决幻读

简介

Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
*往期知识不做重点
事务具有4个特征,分别是原子性、一致性、隔离性和持久性。
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

引入

例题:在隔离级别为不可重复读、可重复读分别输出什么
在这里插入图片描述
1、RR级别:张三 张小三
2、RC级别:张三 张三

RR->RC Innodb做的事情

MySQL底层用链的方式存着版本链
在这里插入图片描述

两个重要名词

快照读:select * from xxx ,普通的sql语句
当前读:select * form xxx for update; delete ; insert into ; update

快照读下使用MVCC——解决不可重复读

undo log 版本链 + Read View 可见性规则
RR 隔离级别实现原理,就是 MVCC 多版本并发控制,而 MVCC 是通过 ReadView+
Undo Log 实现的,Undo Log 保存了历史快照,Read View 可见性规则帮助判断当
前版本的数据是否可见。
Undo Log 版本链长这样
在这里插入图片描述
不可重复读就是最上面图中,两次事务D的select语句,每次获取新的readView
可重复读就是最上面图,两次事务D的select语句,取相同的readView

当前读下使用间隙锁(或next-key-lock)——解决幻读问题

针对于索引区间的查询或者修改,Mysql 会自动对索引间隙加锁,来解决幻读问题。
1、执行语句
SELECT * FROM user WHERE id > 3 AND id<7 FOR UPDATE;
2、假设B+ Tree 的索引结构,这个结构中有四个索引元素分别是:1、3、7、10
加了间隙锁后(3,7),insert into xxx values (5,name)这个时候就无法插入了,要等上面的事务提交以后方能插入
3、当区间变为where id>3,那升级为next-key-lock,索引区间为(-∞,1],(1,3],(3,7],(7,10],(10,+∞]
所以用到了(3,7],(7,10],(10,+∞]


http://www.kler.cn/a/153686.html

相关文章:

  • Linux破解用户密码【基于redhat9】
  • 电子印章管理系统:是什么、3个平台推荐
  • Vulhub-信息泄露
  • 数据结构 / 队列 / 循环队列 / 概念
  • Redis基本命令
  • SQL-分页查询offset的用法
  • Linux部分基础指令讲解
  • Hdoop学习笔记(HDP)-Part.14 安装YARN+MR
  • B.牛牛排队伍——模拟双链表
  • IntelliJ IDEA安装使用教程
  • Redis——某马点评day01——短信登录
  • 【蓝桥杯选拔赛真题51】python最小下标 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  • CSS 绝对定位问题和粘性定位介绍
  • 【九】linux下部署frp客户端服务端实践(内网穿透)
  • Elasticsearch(一)
  • C++学习寄录(九.多态)
  • Python学习路线 - Python语言基础入门 - 准备工作
  • 剑指 Offer(第2版)面试题 12:矩阵中的路径
  • 职场轶事:哭笑不得的领导与同事
  • 8.ROS的TF坐标变换(二):动态坐标变换、多坐标变换代码讲解(以LIO-SAM为例)