当前位置: 首页 > 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.mrgr.cn/news/47292.html

相关文章:

  • 【技术支持】安卓无线adb调试连接方式
  • 算法题(33):长度最小的子数组
  • 卷积神经02-CUDA+Pytorch环境安装
  • abap安装cl_json类
  • UE小白学习日记
  • 极狐GitLab 正式发布安全版本17.7.1、17.6.3、17.5.5
  • 【conda】安装使用 常用命令
  • AI时代下的程序员自我提升之道:如何保持核心竞争力
  • 【解决】虚拟机VMTool安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装
  • 变阻器的未来发展趋势和前景如何?是否有替代品出现?
  • 通信界的5G-A/F5G-A新技术,你知道多少?
  • Linux内核源码阅读——CFS调度
  • Windows工具新电脑设置重置后设置
  • 探索一机两用号召是否和源代码保密冲突
  • [SQL] 安装
  • 科普向 -- 什么是RPC
  • 怎么让电脑定时提醒我做事
  • 太速科技-607-基于FMC的12收和12发的光纤子卡
  • 【openwrt-21.02】T750 openwrt 出现nat46_ipv4_iput crash
  • Linux环境下使用mc命令复制本地文件到minio仓库
  • VMware Workstation 17.6.1 发布下载,修复 4 个已知问题
  • Windows系统安装Fooocus结合内网穿透实现公网环境远程生成AI图片
  • 文献阅读Prov-GigaPath模型--相关知识点罗列
  • Postgres17.0在centos7 编译安装
  • MyBatis 查询结果接收类型的总结与实践
  • 指针揭秘:掌握 Go 语言的内存魔法,让你的编程能力跃升到新高度!