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

Mysql中事务的隔离级别以及实现原理

在mysql的InnoDB存储引擎下支持事务,其中事务级别主要有以下几种

一.事务隔离级别

        1.读未提交

                读未提交是mysql中最低的隔离级别,虽然执行速度快,但是不能解决并发问题。读未               提交允许一个事务读取另一个事务还未提交的数据,会造成脏读。

                会出现脏读、不可重复读、幻读的问题

                详见 脏读、幻读、不可重复读产生的原因及解决方案-CSDN博客

        2.读已提交

                读已提交,只允许读取事务已提交的数据,可以解决脏读的问题。

                会出现不可重复读、幻读的问题

        3.可重复读

                可重复读是InnoDB默认的隔离级别,其保证了事务两次读取同一数据的一致性,解决了             不可重复读。

                目前mysql优化了可重复读,利用锁机制可以解决大部分幻读问题

        4.串行化(序列化)

                所有操作串行化执行,可以解决脏读、幻读、不可重复读。并发能力最低

二.实现原理

        Mysql通过MVCC(多版本并发控制)实现事务的隔离机制。其主要原理是在表中存在三个隐藏字段:“主键ID(不存在主键的情况)”、“事务ID”、“回滚指针”。在事务开启后读取数据时,会为其生成一个read View快照,其中记录着对应数据的事务id。当在并发环境下,事务可以按照依靠undo log实现的回滚指针来保证数据的一致性。

        其中读未提交不使用MVCC机制,所有操作几乎不保证安全。读已提交可以依靠行锁或乐观锁实现。可重复读利用记录锁+间隙锁,锁住范围内数据,不允许插入,或者通过MVCC避免(读取事务开始时产生的快照),可以解决大部分问题。串行化则全部利用排他锁实现。

隔离级别MVCC 行为锁机制解决的异常

Read Uncommitted(读未提交)

不使用 MVCC无锁或最小化锁
Read Committed(读已提交)每次查询生成新 Read View行锁(仅当前记录)脏读
Repeatable Read(可重复读)事务首次生成 Read ViewNext-Key Lock(记录+间隙锁)脏读、不可重复读、部分幻读
Serializable(串行化)禁用 MVCC,完全依赖锁所有操作加锁所有异常

相关文章:

  • [node] 4 http模块
  • skywalking微服务链路追踪
  • 小白电路设计-设计2-可调式单电源直流稳压电路设计
  • Python实战(2)-数据库支持
  • numpy学习笔记14:模拟随机游走过程
  • hadoop-HDFS操作
  • 【链表】一文搞定链表算法:从基础到实战
  • 人工智能:如何把excel中某数据区域中,含有空格数据的单元格标记背景颜色出来?
  • S32K144外设实验(二):ADC单通道单次采样(软件触发)
  • 《Linux:动态库动态链接与静态库静态链接》
  • 声动未来,门店数字化助力韶音加速破圈
  • 4. 移动到末尾(蓝桥云课)
  • stm32第七天震动传感器
  • Java 文件和IO流基础(生动形象版)
  • 进程间通信(1)——管道
  • Android AI ChatBot-v1.6.3-28-开心版[免登录使用GPT-4o和DeepSeek]
  • 深入理解Java内存模型(JMM)及其并发编程中的应用
  • 「JavaScript深入」WebSocket:高效的双向实时通信技术
  • 【基于深度学习的验证码识别】---- part3数据加载、模型等API介绍(2)
  • HAL库编程知识点---Can.c和Driver_can.c分层开发
  • 深圳两家会所涉卖淫嫖娼各被罚7万元逾期未缴,警方发催告书
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 中国天主教组织发贺电对新教皇当选表示祝贺
  • 外交部答澎湃:美方攻击抹黑中加关系与合作的卑劣图谋不会得逞
  • 老铺黄金拟配售募资近27亿港元,用于门店拓展扩建及补充流动资金等
  • 复旦设立新文科发展基金,校友曹国伟、王长田联合捐赠1亿助力人文学科与社会科学创新