MySQL中四个隔离级别的作用以及可能会产生的问题和问题的解决方案

本文介绍了数据库事务中的三个问题:脏读、不可重复读和幻读,并详细解释了它们的含义。接着,讨论了四个不同的事务隔离级别,包括Read Uncommitted、Read Committed、Repeatable Read和Serializable,以及它们如何解决这些问题。最后,提出了针对这三个问题的解决方案,包括加锁策略以提高事务的隔离性。
摘要由CSDN通过智能技术生成

1.三个问题

1.1 脏读问题


脏读的意思不是指数据有多脏,而是指数据有问题。

下面举例子说明。

假如 张三 正在写作业,这个时候 李四 过来了,他看到 张三 正在写代码 hello world 。
李四 看完后就走了,他走之后,张三就把 hello world 给删除了。


这里的李四 就相当于是 事务A,而张三就相当于是 事务B,这两个事务正在读写的是同一份数据。


在这个场景中,张三和李四这两个事务是完全并发的。
也就是说,如果是在没有任何限制的前提下,就会出现 脏读问题(数据有问题)。

总之就是说如果张三更改数据,李四是不会知道的,这也就回出现问题。

1.2 不可重复读


在一个事务中,连续两次读到的结果不一致,就是 不可重复读问题

下面举例说明。

现在已经约定好了,张三在写代码的时候,李四不可以看。要等到提交以后才可以看。

在 张三提交完代码后,李四这开始看代码,
当李四正在看的时候,张三想起代码有不对的地方,于是动手修改了并重新提交了一个版本。
此时就会导致李四在看代码的过程中,代码突然就改变了。

1.3 幻读问题


如果在同一个事务中,两次读到的结果集不同,这就是 幻读问题

比方说,虽然李四在读的时候张三不能修改,但是张三可以做别的事情,例如添加或删除一个文件。
此时,虽然李四读的代码没有改变,但是他发现文件的数量变了。

2.四个隔离级别

  1. read uncommitted
    这个级别不做任何限制,事务之间都是随意并发执行的。
    并发程度最高,隔离性最低,会产生 脏读不可重复读幻读问题

  2. read committed
    此时这个级别对锁操作加锁了,并发程度降低,隔离性提高了。
    解决脏读问题,但是还存在 不可重复读幻读问题

  3. repeatable read
    此时对写和读操作都加锁了,并发程度进一步降低,隔离性进一步提高。
    解决了脏读和不可重复读,但是可能会存在 幻读问题

  4. serializable
    此时会严格串行化,并发程度最低,隔离性最高。
    解决了三个会出现的问题。

第三个级别是默认的级别,在以后的使用过程中要根据需求的场景来确定使用哪个隔离级别。

3.解决方案

3.1 脏读问题的解决:


可以采取 降低并发性,提高隔离性 的方法。

可以简单理解为 给 “写操作” 加锁。

意思就是说。张三在写代码的时候,不让李四看,等把代码提交了之后,李四才可以看。

举例来说明。

有人去上 WC 的时候,进去的时候把门锁上了,这个时候别人就进不来了。

当进行写加锁的时候,张三写的时候,李四就不能看了。
此时就相当于是降低了并发程度,提高了隔离性。
虽然降低了一定的效率,但是提高了准确性。

3.2 不可重复读问题的解决:


可以采用给 读操作加锁的方式

比如说,当李四在读代码的时候,我不可以修改。

此时这两个事务之间的并发程度进一步降低了,隔离性进一步提高了。

虽然运行速度又进一步变慢了,但是数据的准确度又进一步提高了。

3.3 幻读问题的解决:

想要解决幻读问题,可以采用串行化的方式,也就是 彻底的舍弃并发

也就是说,只要李四还在读代码,张三就什么都不能做,只能摸鱼。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与大师约会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值