浅析MySQL InnoDB的隔离级别

news/2024/10/21 9:52:41/
隔离性简介

隔离性主要是指数据库系统提供一定的隔离机制,意思就是多个事务并发执行时,一个事务的执行不应影响其它事务的执行。

数据库中并发一致性问题?

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。

Read uncommitted

未提交读,这种情况下,一个事务A可以看到另一个事务B未提交的数据,如果此时事务B发生回滚,那么事务A拿到的就是脏数据,这也就是脏读的含义。此隔离级别在MySQL InnoDB一般不会使用,不做过多说明。

Read Committed

提交读,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。解决了脏读问题,但是存在幻读现象。

幻读

指的是在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行,也就是"幻行"。

事务的隔离等级?

SQL标准中定义了4种隔离级别,分别是:

  • Read uncommitted: 未提交读,事务中的修改,即使没有提交,对其他事务也是可见的。存在脏读
  • Read committed: 提交读,大多数数据库系统的默认隔离级别(MySQL不是), 一个事务从开始到提交之前,所做的修改对其他事务不可见。解决脏读,存在幻读和不可重复读
  • repeatable read: 可重复读,该级别保证在同一事务中多次读取同样记录的结果是一致的。解决脏读和不可重复读,理论上存在幻读,但是在InnoDB引擎中解决了幻读
  • Serializable:可串行化,强制事务串行执行。

上面4种隔离级别是SQL标准定义的,但是在不同的存储引擎中,实现的隔离级别不尽相同。本文主要介绍MySQL InnoDB 存储引擎中的隔离级别,在InnoDB存储引擎中,Repeatable Read 是默认的事务隔离级别,同时该引擎的实现基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control),解决了幻读问题,当然 脏读和不可重复读也是不存在的。MVCC最大的好处就在于读不加锁,读写不冲突,这样极大的增加了系统的并发性能

MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种:

针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
针对当前读(select … for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。
这两个解决方案是很大程度上解决了幻读现象,但是还是有个别的情况造成的幻读现象是无法解决的。
 

MySQL 可重复读隔离级别,解决幻读了吗?

浅析MySQL InnoDB的隔离级别


http://www.ppmy.cn/news/1025994.html

相关文章

sip语音对讲终端怎么样?

sip语音对讲终端怎么样? IP语音对讲终端是一种通过网络进行语音通信的设备,具有以下特点: 1. 便捷性:IP语音对讲终端可以通过互联网实现远程通信,用户可在任何地点与他人进行语音交流,无需受到距离的限制…

【Nginx】Nginx网站服务

国外主流还是使用apache;国内现在主流是nginx(并发能力强,相对稳定) nginx:高新能、轻量级的web服务软件 特点: 1.稳定性高(没apache稳); 2.系统资源消耗比较低&#xf…

【Linux 网络】 数据链路层协议

数据链路层协议 数据链路层解决的问题以太网协议认识以太网以太网帧格式 认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响ARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式 总结 数据链路层解决的问题 IP拥有将数据跨…

python:使用geopandas和rasterio将矢量范围内的栅格值赋为0并重新输出

需求:有一个点shp文件和一个栅格,想要构建shp中每个点的缓冲区,并且缓冲区范围内的栅格值重新赋为0并输出新的tif文件 解决方法:使用python中的geopandas和rasterio中的掩膜操作实现 代码如下: import numpy as np …

mysql获取第一个逗号前面的字符串

字符串内容如下: 统编版(2019),必修下册,第五单元 ,第10课,10-2 在马克思墓前的讲话 /恩格斯, 想获取,第一个逗号前面的字符串,即:统编版(2019) 需要第一获取逗号的下标位置&…

leetcode242. 有效的字母异位词

题目:leetcode242. 有效的字母异位词 描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s “…

面试了无数家公司整理的软件测试面试题【含答案】

1、自动化代码中,用到了哪些设计模式? 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果, 如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动…

wxWidgets学习笔记:wxListCtrl使用详解

wxListCtrl和wxListBox wxListCtrl和wxListBox都是用于显示列表数据的控件,但它们之间有一些区别。 wxListCtrl通常用于显示复杂的表格数据,可以通过设置列来显示多个属性,还支持对列表项进行排序、编辑和选择。 wxListBox通常用于显示简单…