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

MySQL事务实现原理

目录

MySQL事务介绍

事务基础及其实现原理

回滚日志

MVCC多版本并发控制

事务的特性

多个事务同时执行出现的三种现象

四种隔离级别及其实现原理

尽量不要使用长事务


MySQL事务介绍

要保证⼀组数据库操作,要么全部成功,要么全部失败

事务是在存储引擎层实现的,MySQL是支持多存储引擎的系统,不是所有的存储引擎都支持事务,目前最常用的存储引擎InnoDB是支持事务的

事务基础及其实现原理

回滚日志

回滚日志是一种用于撤销回退的日志。回滚日志会记录一次事务所有操作细节。

当事务回滚就使用回滚日志恢复到以前的那个版本。

回滚日志格式: 事务ID 和 指向版本日志的回归指针 组成,一系列的回滚指针组成版本链。

MVCC多版本并发控制

MVCC是通过 读视图 + 回滚日志 实现的          

        读视图: 记录事务快照时的活跃事务信息,用于判断数据版本的可见性。

        回滚日志: 存储数据的旧版本,读视图通过行数据间接关联到回滚日志实现历史版本的回滚。

事务的特性

原子性: 事务操作是不可分割的

        实现原理: 通过回滚日志实现的               

一致性: 事务操作前后数据库保存一致性状态

        实现原理: 通过持久性+隔离性+原子性来保证。

隔离性: 多个事务同时使用相同的数据,不会相互干扰,对其他事务隔离

        实现原理: 通过MVCC多版本并发控制或锁机制来保证。        

持久性: 对数据的修改是永久的

        实现原理: 通过redo log物理日志来实现的

多个事务同时执行出现的三种现象

脏读: 读取到未提交的数据

不可重复读: 读取到已经提交的数据,但是读两次仅内容不一样,原因是另一个事务提交更新引起

幻读: 读取到已经提交的数据,但是读两次仅行数不一样,原因是是另一个事务提交删除和插入引起

不可重复读和幻读的聚焦点不一样!

如果读两次内容和行数都不一样,这种现象称为幻读的扩展表现(就是既出现了幻读现象,又出现了不可重复读现象)

四种隔离级别及其实现原理

为了解决这些问题,我们提出了隔离级别这个概念

在谈论隔离级别之前,要明确一个事情,隔离的越严实,效率就越低,不是隔离越严实越好,只是在这二者之间找到一个平衡点

读未提交

        出现的现象: 脏读、不可重复读、幻读

                原理: 直接读取最新数据即可

读已提交(Oracle的默认级别)

        出现的现象: 不可重复读、幻读

        原理:事务每次读取数据时生成独立的读视图,通过当前事务ID对读视图里面的事务ID进行对比判断事务的状态是否已经提交,从而确定是否可见,这种原理也叫做MVCC版本并发控制

可重复读(MySQL的默认级别)

        很大程度上避免幻读、不可重复读(不是彻底解决)

        快照读有可能是历史版本的数据,不是最新数据

        当前读一定是最新数据

        原理

                快照读:整个事务都用第一次快照读生成的读视图,此时屏蔽了其他事务的修改,避免了幻读。

                当前读:通过行锁和间隙锁禁止其他事务进行数据修改来解决幻读

        可重复读出现幻读、不可重复读的情况

                首先使用快照读来让整个事务都用第一次快照读生成的读视图,其实这种情况下没有阻止其他事务的修改只是屏蔽,后面再使用当前读读取最新数据。

                此时其他事务修改行内容就出现不可重复读现象,其他事务添加或者删除数据就出现幻读现象        

串行化

        一个事务修改,其他事务不能操作

尽量不要使用长事务

由上面的原理可以知道,事务操作避免不了使用读视图来进行控制,长事务意味着系统回存放很老的读视图,读视图在事务提交之前都必须保留,就会导致大量占用存储空间,而且长事务也可会占用锁资源,拖垮整个数据库

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

相关文章:

  • 低频低压减载装置
  • 构建分布式光伏“四可”能力:支撑新型电力系统安全稳定运行的关键路径
  • turbopack打包机制
  • 边缘计算与AI结合:为物联网设备带来智能决策能力
  • 对S32K144做的VCU安装快速开发Simulink库及VCU例程介绍
  • C#System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误。
  • JS实现页面实时时间显示/倒计时
  • Java 大视界 -- Java 大数据在智能交通智能停车诱导与车位共享中的应用(341)
  • selenium跳转到新页面时如何进行定位
  • 编写bat文件自动打开chrome浏览器,并通过selenium抓取浏览器操作chrome
  • 如何使用Java WebSocket API实现客户端和服务器端的通信?
  • Language Models are Few-Shot Learners: 开箱即用的GPT-3(二)
  • Android 应用常见安全问题
  • Windows Edge 播放 H.265 视频指南
  • 多模态大语言模型arxiv论文略读(156)
  • 论文阅读笔记:VI-Net: Boosting Category-level 6D Object Pose Estimation
  • web前端面试笔记
  • 微软365 PDF导出功能存在本地文件包含漏洞,可泄露敏感服务器数据
  • C#集合:从基础到进阶的全面解析
  • qemu vcpu的创建过程
  • Debian-10编译安装Mysql-5.7.44 笔记250706
  • Windows 11 安装过程中跳过微软账户创建本地账户
  • 深度学习_全连接神经网络
  • 深入理解Java虚拟机:Java内存区域与内存溢出异常
  • Linux 操作系统如何实现软硬件解耦?从容器与硬件接口封装谈起
  • 数字孪生技术引领UI前端设计新趋势:增强现实与虚拟现实的融合应用
  • 计算机学科专业基础综合(408)四门核心课程的知识点总结
  • Docker高级管理--容器通信技术与数据持久化
  • 从零开始搭建深度学习大厦系列-3.卷积神经网络基础(5-9)
  • 【网络编程】 TCP 协议栈的知识汇总