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

MySQL事务+MVCC(精简版,包教包废)

        加油加油,冲刺秋招

事务概念

一组操作的最小单元,所有操作要么同时成功,要么同时失败

事务四大特性ACID及实现原理

原子性(Atomicity

所有操作要么同时成功,要么同时失败。事务不可再分

原子性通过undolog实现,事务回滚通过undolog进行

一致性(Consistency)

事务执行前后数据总状态一致

一致性通过原子性,持久性,隔离性一起实现

持久性(Isolation)

事务对数据库的改变是永久的,哪怕数据库宕机也不会发生改变

持久性通过redolog实现

隔离性(Durability)

事务之间不会相互影响

隔离性通过MVCC实现

具体讲讲四大特性是怎么实现的?

并发事务带来的问题

脏读 :事务A读到事务B未提交的数据

脏写 :事务B覆盖了事务A先写入的数据,最后一个更新的覆盖了之前更新的数据

不可重复读 :事务A相同的查询语句前后执行的结果不同

幻读 : 事务A两次查询前后读取的数据量不同

Mysql的隔离级别

读未提交:顾名思义,解决不了并发事务带来的问题

读已提交:事务A只能读到其他事务已提交的数据,通过MVCC实现,解决脏读脏写的问题

可重复读:在事务执行过程中,数据是一致性的

可串行化:会对记录加上读写锁,解决所有事务的并发问题,所以性能自然差一些

MVCC

mvcc基础概念

Mvcc:多版本并发控制器,解决事务读写冲突的问题,对事务进行隔离。通过ReadView+undolog指针实现

ReadView:数据快照,包含四大元素。最小事务id,最大事务id,活跃事务id列表

ReadView的读取规则(结合事务的隔离性就很好理解了)

1比最小事务id小,说明在此事务开始前就提交了,肯定能读到

2比最大事务id大,说明在此事务之后才开启,一定不读

3在活跃id列表里面,说明事务还未提交,不读

4比最小事务id大,比最大事务id小,不在活跃id列表里面,说明事务提交了,可以读

5当前事务id,自己的肯定读

快照读:普通select语句,读取数据某一时间点的版本,读取的是

当前读:select for update语句,读取数据当前最新的版本,可以看到其他事务对数据的改变

MVCC怎么实现读已提交和可重复读的?

读已提交:每次读取的是最新的数据,每次读取都会生成一个ReadView

可重复读:事务开启时才会生成数据快照,之后事务执行期间都使用这个快照

读已提交和可重复读的本质区别在于ReadView的生成时间不同

MVCC能解决幻读吗?(评论区回答)

MVCC在可重复读级别下可以解决部分幻读问题

针对快照读:

针对当前读

http://www.dtcms.com/a/362587.html

相关文章:

  • 2025华为最值得入的耳机,真的赢麻了!
  • 结构抗震与土木工程研究
  • SylixOS 下的信号系统
  • Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • Chrome浏览器调用ActiveX控件之allWebOffice在线编辑控件
  • JD潜在前端二面高频题解析
  • mysql5.6+分页时使用 limit+order by 会出现数据重复问题
  • 蓝桥杯算法之基础知识(5)
  • 基于Spark的新冠肺炎疫情实时监控系统_django+spider
  • 数据结构与算法个人学习代码笔记包含leetcode,海贼oj,蓝桥杯,ACM
  • 华为Fit4:腕间助手,守护你的健康,带你开启智慧生活
  • 【字节拥抱开源】 UXO 团队开源 USO: 通过解耦与奖励学习实现的统一风格与主题驱动生成
  • 2025最新“Java 面试八股文 + 各大厂的面试真题”限时开源
  • 美团 LongCat 开源大模型60 亿参数 MoE 架构,赋能开发者加速 AI 应用落地
  • 本地搭建并使用 Redmine 详细教程
  • CICD 持续集成与持续交付
  • SGLang推理引擎--高效的开源部署方案
  • 【第四章:大模型(LLM)】09.最强开源大模型:Llama3 原理介绍与实现-(6)Llama2 Llama3代码实现
  • Wifi开发上层学习1:实现一个wifi搜索以及打开的app
  • 零依赖每月工作计划备忘录:高效管理你的每一天
  • Qt 创建的C++ 桌面程序 学习笔记1
  • Elasticsearch创建索引分片和副本大小建议
  • iOS XML 处理利器:CNXMLParser 与 CNXMLDocument 深度解析
  • iOS15如何绕过MDM锁?详细图文教程教你搞定
  • 数据结构:基数排序 (Radix Sort)
  • uni-app iOS 性能监控与调试全流程:多工具协作的实战案例
  • Qt中QSettings的键值使用QDataStream进行存储
  • 【Vue2 ✨】Vue2 入门之旅(七):事件处理
  • 从spring MVC角度理解HTTP协议及Request-Response模式
  • 自学嵌入式第三十二天:网络编程-UDP