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

MySQL——事务、MVCC

目录

什么是事务?

事务的四大特性

事务的隔离级别

事务的原理

redo log

undo log

MVCC实现原理

概念

隐藏字段

undo log版本链

readview


什么是事务?

    事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要不同时失败。

    用一个形象的比喻:事务就像银行转账操作,从A账户扣款和向B账户加款这两个操作必须作为一个整体执行——要么都成功完成,要么都不执行。如果只执行了其中一个操作,就会导致数据不一致。

事务的四大特性

  • 原子性:事务是不可分割的最小操作单元,要么同时成功,要么同时失败。
  • 一致性:事务完成时,必须使所有的数据保持一致状态。
  • 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

事务的隔离级别

  • 读未提交(Read Uncommitted):事务可以读取其他未提交事务的修改。会导致脏读(Dirty Read)、不可重复读和幻读。

  • 读已提交(Read Committed):事务只能读取其他已提交事务的修改。解决了脏读,但仍可能存在不可重复读(Non-repeatable Read) 和幻读。这是Oracle等数据库的默认级别。

  • 可重复读(Repeatable Read):确保在同一事务中多次读取同一数据的结果是一致的。解决了脏读和不可重复读,但仍可能存在幻读(Phantom Read)。这是MySQL InnoDB的默认级别。

  • 串行化(Serializable):最高隔离级别,强制事务串行执行,完全避免脏读、不可重复读和幻读,但性能开销最大。

事务的原理

redo log

    重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性

    该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中,当事务提交之后会把所有的修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用

    当对缓冲区的数据进行增删改之后,首先会把增删改的数据记录在redo log buffer中,redo log buffer就会去记录数据页的物理变化。当事务提交的时候就会把redo log buffer中数据页变化刷新到磁盘中。当进行脏页刷新时出错了,就能通过redo log进行恢复。

undo log

    回滚日志,用于记录数据被修改前的信息,作用包含:提供回滚、MVCC(多版本并发控制)。

    redo log是记录物理日志,而undo log是逻辑日志。当执行delete或update时,它都会记录一条相反的记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容

    Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立刻删除undo log,这些日志还可能用于MVCC。

    Undo log存储:undo log采用段的方式进行管理和记录,存放在rollback segment回滚段中。

MVCC实现原理

概念

  • 当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。
  • 快照读:简单的select(不加锁)就是快照读,读取的是可见版本,有可能是历史数据,不加锁,是非阻塞读。RC:每次select都会生成一个快照读;RR:开启事务后的第一个select语句就是快照读的地方;S:快照读变成当前读
  • MVCC:Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读的功能。具体实现还依赖数据库中的三个隐藏字段、undo log、readView。

隐藏字段

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

undo log版本链

    用 Undo Log 将一条记录的多个历史版本串联起来,形成一个基于ROLL_PTR(回滚指针)的链表结构。

    这个链表使得数据库能够“回到过去”,找到记录在某个特定时间点的状态。

readview

    Readview是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃(未提交)事务的id。包含四个核心字段:

  • m_ids:当前活跃事务的id集合
  • min_trx_id:最小活跃事务id
  • max_trx_id:预分配事务id,当前最大事务id+1
  • creator_trx_id:Readview创建者的事务id

文章转载自:

http://ris3BkzC.jpnfm.cn
http://tXvabwjo.jpnfm.cn
http://MtEU7eBI.jpnfm.cn
http://yFp8L0w5.jpnfm.cn
http://7WhbKDtO.jpnfm.cn
http://OsyknNWW.jpnfm.cn
http://oF37si9v.jpnfm.cn
http://uri8Yw7u.jpnfm.cn
http://Khv9zWPq.jpnfm.cn
http://TGIIqd61.jpnfm.cn
http://BeXal0aX.jpnfm.cn
http://x3rjsQbr.jpnfm.cn
http://8tLGZ78c.jpnfm.cn
http://AvtKQevu.jpnfm.cn
http://PeVyjDw0.jpnfm.cn
http://jdpm8bee.jpnfm.cn
http://v6jtPey7.jpnfm.cn
http://MyIgEWvy.jpnfm.cn
http://v7NnEuuE.jpnfm.cn
http://QnhUH70Y.jpnfm.cn
http://LmQnkgVb.jpnfm.cn
http://8r2VfXgy.jpnfm.cn
http://vp4iMPjt.jpnfm.cn
http://HKZ5xlcy.jpnfm.cn
http://m3kEuEVs.jpnfm.cn
http://K5M26fLJ.jpnfm.cn
http://qibL4kvC.jpnfm.cn
http://s4lJzhuG.jpnfm.cn
http://fvsjBhqj.jpnfm.cn
http://Y0CzNfcJ.jpnfm.cn
http://www.dtcms.com/a/373287.html

相关文章:

  • vue2 elementUI 登录页面实现回车提交登录的方法
  • 数据库约束表的设计
  • ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes 数据集构建
  • c++primer 个人学习总结--高级主题
  • 【AI】AI 评测入门(二):Prompt 迭代实战从“能跑通”到“能落地”
  • 经验分享:如何让SAP B1数据库性能提升50%
  • kaggle_吃鸡_数据预处理随机森林
  • Excel随机金额或数字分配方法
  • cocos异步加载问题
  • Spring Boot 多数据源配置
  • 信奥赛csp初赛高频考点真题分类解析之:基本运算
  • langchain 输出解析器 Output Parser
  • [数据结构] 栈 · Stack
  • 大语言模型的链式思维推理:从理论到实践
  • C语言快速排序
  • 软件可靠性失效严重程度分类与深度解析
  • 如何让dify分类器更加精准的分类?
  • C# Web API 前端传入参数时间为Utc
  • Python爬虫实战:研究3D plotting模块,构建房地产二手房数据采集和分析系统
  • sglang pytorch NCCL hang分析
  • langchain 缓存 Caching
  • Spark生态全景图:图计算与边缘计算的创新实践
  • 最长上升/下降子序列的长度(动态规划)
  • 自动驾驶中的传感器技术38——Lidar(13)
  • 计算机组成原理:计算机的分类
  • Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
  • 辨析——汇编 shell C语言
  • 免费的SSL和付费SSL 证书差异
  • 全新 Navicat On-Prem Server 3 正式上线,数据库云管理能力全面跃升
  • 华大 MCU 串口 PWM 控制方案完整笔记