阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL事务隔离级别

263次阅读
没有评论

共计 1472 个字符,预计需要花费 4 分钟才能阅读完成。

导读 业务系统在运行的时候,往往有很多线程同时在操作数据库,MySQL 也需要多线程的处理多个请求,那么每个事务里的多个 SQL 语句是如何执行的呢?基本都是从磁盘加载数据页到 Buffer Pool 的缓存页里去,然后更新 Buffer Pool 里的缓存页,同时记录 redo log 和 undo log。

MySQL 事务隔离级别

多个线程并发执行的时候,会有一些问题:

多个事务并发执行,可能会对缓存页里的同一行数据进行更新,这种冲突怎么解决?

有的事务在对一行数据进行更新,另一个事务在对这行数据进行查询,这个冲突怎么解决?

接下来要讲的内容,主要包括多事务并发运行存在的问题、MySQL 的事务隔离级别、MVCC 多版本控制、锁。

脏读

事务 1 读取了事务 2 更新的数据,然后事务 2 回滚操作,那么事务 1 读取到的数据就是脏数据。

例如:

张三的工资是 8000,现在领导要给他涨工资到 10000。

事务 1 把他的工资改为 10000,但事务还没提交。

事务 2 正在读取张三的工资,独到的是 10000。

事务 1 此时回滚了,张三的工资又变成 8000 了。

事务 2 读取到张三的工资 10000 为脏数据,事务 2 做了一次脏读。

不可重复读

事务 1 多次读取同一数据,事务 2 在事务 1 多次读取的过程中,对数据作了更新并提交,导致事务 1 多次读取同一数据时,结果不一致。

例如:

事务 1,读取到张三的工资 8000。

事务 2,把张三的工资改为 10000,提交事务。

事务 1,再次读取张三的工资,此时工资为 10000。

在一个事务中前后两次读取同一个数据的结果不一样,就是不可重复读。

幻读

一个事务用一样的 SQL 多次查询,每次查询发现查到一些之前没看到过的数据。

比如,目前公司工资为 8000 的人有 10 人。

事务 1,读取所有工资为 8000 的人数为 10 人。

事务 2,插入一条工资为 10000 的记录。

事务 1 再次读取工资为 8000 的人,为 11 人。

此时,事务 1 出现幻觉似的,同样的 SQL 查询语句,第一次查出来 10 人,第二次查出来 11 人。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

脏读、不可重复读、幻读,数据库并发执行,每个线程可能会开启一个事务,每个事务都会执行 crud 操作。

数据库并发的执行多个事务,多个事务并发的对缓存页里的同一批数据进行 crud,就可能导致脏读、不可重复读、幻读这些问题。

所以,这些问题的本质是,数据库多事务并发问题,为了解决这些问题,数据库设计了事务隔离级别、MVCC 多版本控制、锁机制。

事务隔离级别

SQL 标准中定义了 4 种事务隔离级别,就是说事务并发运行的时候,互相是如何隔离的,MySQL 默认是可重复读 (RR)。

MySQL 事务隔离级别

不同的隔离级别是可以避免不同的事务并发问题的。

read-uncommitted(RU),可能会发生脏读、不可重复读、幻读。

read-committed(RC),不会发生脏读,但是会发生不可重复读、幻读

也就是说,事务没提交的情况下修改的值,你是读不到的。但是,一旦事务提交了,你事务就能读到,所以可能你多次读到的值不一样。

repeatable-read(RR),MySQL 默认的事务隔离级别,做了大量复杂的工作,解决了脏读、不可重复读、幻读问题,一般生成环境使用这个隔离级别就可以了。

serializable,事务串行执行,根本不会并发执行,所以不会有脏读、不可重复读、幻读这些问题。但缺点也非常明显,就是并发太差了。一般生产环境也不会使用

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1472字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7804143
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
星哥带你玩飞牛NAS-7:手把手教你免费内网穿透-Cloudflare tunnel

星哥带你玩飞牛NAS-7:手把手教你免费内网穿透-Cloudflare tunnel

星哥带你玩飞牛 NAS-7:手把手教你免费内网穿透 -Cloudflare tunnel 前言 大家好,我是星...
优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器 在多台服务器同时运行的环境中,性能监控、状态告警、资源可视化 是运维人...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...