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

【多版本并发控制(MVCC)】

并发事务问题:

在这里插入图片描述

MySQL隔离级别-未提交读,提交读,可重复读,序列化

隔离级别对于并发事务的解决情况

隔离级别脏读不可重复读幻读
未提交读不可不可不可
读已提交不可不可
可重复读 (默认)不可
串行化(性能低)

默认隔离级别:可重复读

日志类型

undo log:
逻辑日志,事务回滚时,通过逆操作恢复到原来的数据。(保证了原子性和一致性)

在这里插入图片描述

redo log:
记录数据页的物理变化,服务宕机时恢复数据 (保证了持久性)
在这里插入图片描述

MVCC(多版本并发控制)

具体实现方式: 数据隐藏字段、undo log、readView

数据库每条记录中包含三个隐藏字段,如下:

字段名称描述
DB_TRX_ID最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID
DB ROLL_PTR回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。
DB_ROW_ID隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

实例如下:
在这里插入图片描述

undo log 版本链:

在这里插入图片描述

ReadView、当前读、快照读之间的区别

  • ReadView

ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

  • 当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当当前记录,会对读取的记录进行加锁。对于我们日常的操作
如:select … lock in share mode(共享锁),select …for update,upodate,insert,delete(排他锁)都是一种当前读

  • 快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
Read Committed:每次select,都生成一个快照读。
Repeatable Read:开启事务后第一个select语句才是快照读的地方5,

readView的数据结构:

在这里插入图片描述

版本链数据访问规则如下:

在这里插入图片描述

在这里插入图片描述
实例如下:

在这里插入图片描述
特别说明:
在RR级别下,连续多次快照读,ReadView会产生复用,没有幻读问题。
特例:当两次快照读之间存在当前读,ReadView会重新生成,导致产生幻读

http://www.lryc.cn/news/462059.html

相关文章:

  • 常见漏洞及webshell工具的流量特征
  • python学习-怎么在Pycharm写代码
  • 牛客周赛63(C++实现)
  • 高级英语1第四版教材全解pdf课后答案+课文翻译张汉熙
  • 视频去水印软件3款推荐:好用的去水印软件分享!
  • perl文件测试操作符及其意义
  • NC 单据模板自定义项 设置参照(自定义参照)
  • Element-ui官方示例(Popover 弹出框)
  • Bootstrap 5 练习 - 显示工具提示
  • 【p2p、分布式,区块链笔记 Torrent】: WebTorrent GitTorrent bittorrent-dht
  • 【Next.js 项目实战系列】05-删除 Issue
  • Springboot api http并发测试请求
  • Qt的websocket客户端和服务器测试(非安全版本)
  • Prometheus运维监控平台之监控指标注册到consul脚本开发、自定义监控项采集配置调试(三)
  • C语言——数组
  • MySQL-09.DDL-表结构操作-查询修改删除
  • WileyNJDv5_Template模板无法编译生成pdf文件
  • 亿配芯城(ICGOODFIND)教你外贸(海外)推广电子元器件芯片的专用词语
  • windows和linux的一些使用问题一一记录
  • 排序算法上——插入,希尔,选择,堆排序
  • Mycat 详细介绍及入门实战,解决数据库性能问题
  • FFmpeg源码:avformat_new_stream函数分析
  • 【java】深入解析Lambda表达式
  • Chromium html<img>对应c++接口定义
  • 卸载Python
  • 算法剖析:二分查找
  • Invoke 和 InvokeRequired以及他们两个的区别
  • SpringBoot概览及核心原理
  • 根据basic auth请求https获取token
  • 【基础版】React缓存路由