首页 > 其他分享 >说透事务中的脏读、脏写、不可重复读、幻读

说透事务中的脏读、脏写、不可重复读、幻读

时间:2024-07-24 17:06:34浏览次数:13  
标签:事务 脏写 幻读 回滚 脏读 提交 数据

事务的四个基本特性:ACID,原子性,一致性,隔离性,持久性。
事务的脏读、脏写、不可重复读、幻读等问题,主要发生在并发事务中。没有并发事务,就不会有上述问题。
事务并发时,会带来两个问题:
写冲突:多个事务同时修改同一条数据,写的先后顺序如何确定?一个事务已经提交了,另一个事物回滚了,怎么办?
读写冲突:一个事务在写数据,另一个事务要读数据,未提交事务的数据要不要展示给读数据的事务看?
这种读写冲突导致的问题,前辈们已经总结好了,分别是:脏写、脏读、不可重复读、幻读
事务的四个原则中,隔离性,说明事物之间应该是互不干扰的,同时执行的事务不能相互冒犯。如果事务不加以认为控制,就是这样混乱的,因此才有了一致性这个概念,用来将事务之间的影响降到最低。
原始的事务,是混沌状态的,无序的。只有用四个基本原则给限制起来,才能为我们所用。
脏写
table 中name字段原值为C
事务A和B按照如下时间线运行。事务A先提交事务,此时数据修改为A,之后事务B回滚,table中name字段值回滚为C。
此时,对事务A来说,就发生了脏写。

脏读
table 中name字段原值为C
事务A第一次查询,值为C,此时事务B更新为B,事务A第二次查询,值为B,事务B回滚,事务A第三次查询,值为C。对于事务A来说,就发生了脏读。按照事务之间不会相互冒犯来说,事务A从头到尾读到的值都应该是C,不会出现一会是C 一会是B的情况。

脏读和脏写共同之处:
● 发生的原因都是另一个事物通过undo log进行回滚所导致的
● 对相同的数据做了操作
● 脏读和脏写所操作的数据也叫做脏数据(在内存中修改了还未及时刷入磁盘的数据)
为了防止脏读,每次写入前,数据库都会记住旧值。 当前事务尚未提交时,其他事务的读取都会拿到旧值。当前事务提交后,其他事务才能读取到新值。
为了防止脏写,数据库一般用行锁。当事务想要修改特定的行时,必须先获得该行的锁。一次只有一个事务可持有任何给定行的锁。如果另一个事务要写入同一行,就必须等到第一个事务提交或回滚后。

不可重复读
table 中name字段原值为C
它是指在同一个事务里面,查询同一条数据,每次查询到的数据都不一样。是不是和脏读很像?区别在于脏读是由事务回滚导致每次读取的数据不一样,不可重复读是因为事务提交导致每次读取数据不一致。

幻读
table 中name字段原值为C。
事务第一次查询到一条数据,第二次查询到两条数据。
是不是和不可重复读很像?区别在于不可重复读 读取的是同一条数据,另一个事务更新,导致读到的同一条数据的某个字段值不一致。幻读则是另一个事务插入,导致读到的数据总条数不一致。

隔离级别
事务的初始状态是混沌的,无序的,因此需要给事务一个规则,让他们为我所用。
隔离级别,就是控制事务之间关联关系的。

read uncommited-读未提交:可以读取到未提交事务的数据。相当于没有隔离级别。事务处于混沌状态
read commited-读已提交:可以读取到其他事务已经提交的数据。mysql默认隔离级别。
repeatable read 可重复读:事务开启之后,在任何时间节点,不论其他事务是否提交,该事务读取到的值都是一样的。相当于有了一个数据库的副本。
serializable-串行:每次只能执行一个事务,所有事务排着队进行处理。完全禁止并发。实际中不会使用这个级别,性能损耗太大了。

标签:事务,脏写,幻读,回滚,脏读,提交,数据
From: https://www.cnblogs.com/public-communion/p/18321290

相关文章

  • 脏读,幻读,不可重复读
    案例: 操作步骤及解读:11.创建数据库:2createdatabaseceshi;342.创建表:56CREATETABLEtest_table(7idINTPRIMARYKEY,8valueVARCHAR(100)9);10插入数据11INSERTINTOtest_table(id,value)VALUES(1,'yujia......
  • 脏读:数据一致性问题及解决方案
    目录前言一、脏读的定义二、脏读的原因三、解决脏读的方案四、Demo讲解前言        在多线程或分布式系统中,当多个线程或进程同时访问和修改共享资源时,可能会出现数据不一致的情况。其中一个经典的问题就是脏读。本文将详细介绍脏读的概念、原因和解决方案,帮......
  • 详解MVCC以及尽可能解决幻读的两种方案
    MVCC通过「版本链」来控制并发事务访问同一个记录时的行为并行事务问题+隔离级别幻读:在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。脏读:读到其他事务未提交的数据;不可重复读:前后读取......
  • mysql 隔离级别为可重复读如何解决幻读
    MySQL中的可重复读(RepeatableRead,RR)隔离级别通过几种机制来解决幻读问题:1.**多版本并发控制(MVCC)**:在可重复读隔离级别下,MySQL使用MVCC来管理事务读取的数据版本。这意味着在事务开始时,系统会创建一个ReadView(读视图),该视图记录了当前所有活跃事务的ID。当执行SELECT查询时......
  • MySQL解决幻读(2)
    MySQL的默认隔离级别(REPEATABLE-READ)如何解决脏读和不可重复度脏读读取到未提交的数据不可重复度两次读取的数据不一致,侧重与数据的更新幻读两次读取的数据不一致,侧重数据的新增和删除解决根据当前读或MVCC来解决脏读和不可重复读的当前读:加锁,在读取时会将所有数据加......
  • 数据库之隔离级别,脏读幻读,事务特性
    目录1事务隔离级别1.1默认隔离级别1.2读未提交1.3读已提交1.4可重复读1.5序列化2事务关键词2.1定义(脏读,不可重复读,虚读)2.2不可重复读与幻读的区别3事务的四个特性3.1原子性3.2一致性3.3隔离性3.4持久性1事务隔离级别1.1默认隔离级别ISOLATION_DEFAULT:默认......
  • MySQL幻读问题
    幻读指的是一个事务开启之后,执行了两次相同的SELECT查询某一范围内的数据,但是第二次查询返回了第一次未返回的行,也就是读取到了幻行,这就是幻读问题。MySQL官方也将这个问题叫做幻象问题,读取到的行叫做幻行。地址:https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-lo......
  • 事务的隔离级别及脏读,不可重复读,幻读等问题
    事务隔离级别以及对应的问题如上所示。读未提交:在修改数据时在没有提交时就修改了数据库,如果修改回滚则又修改为原值,这样的话在修改与回滚之间读取的数据就是不准确的,会产生脏读现象。脏读现象是读取到未修改的数据,即是数据逻辑上不存在的数据(因为回滚未提交),而下面产生的问题均......
  • MVCC多版本并发控制和幻读问题的解决
    首先我们先介绍一下锁的分类,再进入今天的正题。一、锁分类:1.从性能上分:乐观锁、悲观锁。乐观锁(用版本号对比或CAS机制)适用于读比较多的场景,悲观锁适用于写比较多的场景。如果在写比较多的场景使用乐观锁,会导致对比次数过多,影响性能。2.从对数据的粒度上分:表锁、页锁、行锁......
  • 什么是幻读,脏读,不可重复读?事务的各个隔离级别都是如何实现的?
    一、什么是幻读,脏读,不可重复读?事务A、B交替执行,事务A读取到事务B未提交的数据,这就是脏读。在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并悄悄提交,之后事务A再次查询相......