0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL事务隔离级别要实际解决的问题

冬至子 来源:后端元宇宙 作者:binron 2022-11-17 17:00 次阅读

在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。

MySQL 是支持多事务并发执行的。否则来一个事务处理一个请求,处理一个人请求的时候,其它事务都等着,那估计都没人敢用MySQL作为数据库,因为用户体验太差,估计都要砸键盘了。

既然事务可以并发操作,这里就有一些问题:一个事务在写数据的时候,另一个事务要读这行数据,该怎么处理?一个事务在写数据,另一个数据也要写这行数据,又该怎么处理这个冲突?

这就是并发事务所产生的一些问题。具体来说就是:脏读不可重复读幻读

概念说明

以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思。

脏读

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。

图片

脏读最大的问题就是可能会读到不存在的数据。比如在上图中,事务B的更新数据被事务A读取,但是事务B回滚了,更新数据全部还原,也就是说事务A刚刚读到的数据并没有存在于数据库中。

从宏观来看,就是事务A读出了一条不存在的数据,这个问题是很严重的。

不可重复读

不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。

图片

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

幻读

脏读、不可重复读上面的图文都很好的理解,对于幻读网上有很多文章都是这么解释的

幻读错误的理解:说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 15 条记录。这其实并不是幻读,既然第一次和第二次读取的不一致,那不还是不可重复读吗,所以这是不可重复读的一种。

正确的理解应该是

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

举例

假设有张用户表,这张表的 id 是主键。表中一开始有4条数据。

图片

我们再来看下出现 幻读 的场景

图片

这里是在RR级别下研究(可重复读),因为 RU / RC 下还会存在脏读、不可重复读,故我们就以 RR 级别来研究 幻读,排除其他干扰。

1、事务A,查询是否存在 id=5 的记录,没有则插入,这是我们期望的正常业务逻辑。

2、这个时候 事务B 新增的一条 id=5 的记录,并提交事务。

3、事务A,再去查询 id=5 的时候,发现还是没有记录(因为这里是在RR级别下研究(可重复读),所以读到依然没有数据)

4、事务A,插入一条 id=5 的数据。

最终 事务A 提交事务,发现报错了。这就很奇怪,查的时候明明没有这条记录,但插入的时候 却告诉我 主键冲突,这就好像幻觉一样。这才是所有的幻读。

不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。

事务的隔离级别

上述所说的"脏读",“不可重复读”,"幻读"这些问题,其实就是数据库读一致性问题,必须由数据库提供的事务隔离机制来进行解决。

图片

首先说读未提交,它是性能最好,也可以说它是最野蛮的方式,因为它压根儿就不加锁,所以根本谈不上什么隔离效果,可以理解为没有隔离。

再来说串行化。串行化就相当于上面所说的,处理一个人请求的时候,别的人都等着。读的时候加共享锁,也就是其他事务可以并发读,但是不能写。写的时候加排它锁,其他事务不能并发写也不能并发读。

最后说读提交和可重复读。这两种隔离级别是比较复杂的,既要允许一定的并发,又想要兼顾的解决问题。MySQL默认事务隔离级别为可重复读(RR),oracle默认事务隔离级别为读已提交(RC),

数据库的事务隔离越严格,并发副作用越小,但付出的代价越大;因为事务隔离本质就是使事务在一定程度上处于串行状态,这本身就是和并发相矛盾的。

同时,不同的应用对读一致性和事务隔离级别是不一样的,比如许多应用对数据的一致性没那么个高要求,相反,对并发有一定要求。

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MySQL
    +关注

    关注

    1

    文章

    776

    浏览量

    26011
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 mysql数据库+redis实战:Mysql隔离级别有哪些

    数据库隔离MySQL
    Mr_haohao
    发布于 :2022年09月16日 13:14:59

    大数据MySQL8.0-155-MySQL事务-隔离级别-概述#硬声创作季

    MySQL大数据
    电子学习
    发布于 :2023年01月05日 15:46:11

    事务的四大特性

    事务和并发一致性、封锁、隔离级别
    发表于 05-09 06:49

    详解Mysql数据库InnoDB存储引擎事务

    关于Mysql数据库InnoDB存储引擎事务的一点理解
    发表于 05-13 10:11

    Mysql事物级别的定义

    Mysql的事物级别
    发表于 06-03 15:23

    mysql隔离性测试

    mysql事务隔离级别测试
    发表于 09-09 14:27

    MySQL的索引、事务、视图介绍

    MySQL--索引、事务、视图
    发表于 06-15 07:05

    MySQL存储引擎简析

    索引的情况下才会起作用。InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读。Myisam  Myisam 的存储文件有三个,后缀名分别是.frm
    发表于 09-06 06:07

    关于数据库事务隔离级别与原理的四大关键点

    任何支持事务的数据库,都必须具备四个特性,分别是: 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)
    发表于 03-08 08:59 1030次阅读

    MySQL事务日志

    大家都清楚,日志是 MySQL 数据库的重要组成部分,记录着数据库运行期间各种状态信息。MySQL 日志主要包括「错误日志」、「查询日志」、「慢查询日志」、「二进制日志(binlog)」和 事务日志
    的头像 发表于 11-14 09:58 1562次阅读
    <b class='flag-5'>MySQL</b><b class='flag-5'>事务</b>日志

    MySQL事务的四大隔离级别详解

    之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离
    的头像 发表于 11-27 16:07 2503次阅读

    关于Mysql的20道问题详解

    1.什么Mysql事务事务的四大特性?事务带来的什么问题? Mysql事务
    的头像 发表于 10-26 09:56 1285次阅读
    关于<b class='flag-5'>Mysql</b>的20道问题详解

    你是否对MySQL数据库中的事务已经有所了解呢?

    你是否对 MySQL 数据库中的事务已经有所了解?看下面这张图,按照 1~6 的顺序依次执行,在RR隔离级别下,事务 A 和
    的头像 发表于 02-21 17:20 290次阅读

    MYSQL事务的底层原理详解

    事务的实现机制上,MySQL 采用的是 WAL:Write-ahead logging,预写式日志,机制来实现的。
    的头像 发表于 11-15 10:10 232次阅读
    <b class='flag-5'>MYSQL</b><b class='flag-5'>事务</b>的底层原理详解

    阿里二面:了解MySQL事务底层原理吗

    MySQL 是如何来解决脏写这种问题的?没错,就是锁。MySQL 在开启一个事务的时候,他会将某条记录和事务做一个绑定。这个其实和 JVM 锁是类似的。
    的头像 发表于 01-18 16:34 170次阅读
    阿里二面:了解<b class='flag-5'>MySQL</b><b class='flag-5'>事务</b>底层原理吗