关于脏读、幻读和不可重复读

1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 
e.g. 
        1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务) 
        2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地! 
        3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000 
          像这样,Mary记取的工资数8000是一个脏数据。

2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。 
    e.g. 
    1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 
    2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 
    3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000

解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。 
   e.g. 
   目前工资为1000的员工有10人。 
   1.事务1,读取所有工资为1000的员工。 
   2.这时事务2向employee表插入了一条员工记录,工资也为1000 
   3.事务1再次读取所有工资为1000的员工 共读取到了11条记录,

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

不可重复读的重点是修改 : 
同样的条件, 你读取过的数据,再次读取出来发现值不一样了 
幻读的重点在于新增或者删除 
同样的条件, 第 1 次和第 2 次读出来的记录数不一样

时间: 2024-08-06 07:56:53

关于脏读、幻读和不可重复读的相关文章

数据库隔离 脏读 幻读与不可重复读

一.隔离级别与现象 数据库隔离有4个级别 read uncomitted ,未授权读取 read committed ,授权读取 repeatable read , 可重复读 serializable ,串行化 可能产生的不一致的现象有3种 脏读 不可重复读 幻读 二.3种现象 脏读,就是读了脏数据:另一个事务修改了数据但未提交,我们读到了这个未提交的数据即脏数据,这种现象就是脏读: 举个栗子,balance字段值为100,另一个事务修改为200,未提交的时候我们读到了200,接着那个事务回滚了

数据库事务隔离级别-- 脏读、幻读、不可重复读

一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解决脏读 .不可重复读 .幻读 这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意

事务的四大特性&脏读、幻读、不可重复读的区别&事务的隔离级别

一.什么是事务 事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元): 事务的四大特性: 1 .原子性 (atomicity):强调事务的不可分割. 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 .一致性 (consistency):事务的执行的前后数据的完整性保持一致. 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态.因此

Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中 2.事务并发会产生什么问题 1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了. 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5

数据库的脏读、幻读、不可重复读

1.脏读: 指一个事务A正在访问数据,并且对该数据进行了修改,但是这种修改还没有提交到数据库中(也可能因为某些原因Rollback了).这时候另外一个事务B也访问这个数据,然后使用了这个被A修改的数据,那么这个数据就是脏的,并不是数据库中真实的数据.这就被称作脏读. 解决办法:把数据库事务隔离级别调整到READ_COMMITTED 即让用户在更新时锁定数据库,阻止其他用户读取,直到更新全部完成才让你读取. 2.幻读: 指一个事务A对一个表中的数据进行了修改,而且该修改涉及到表中所有的数据行:同时

数据库中的脏读、幻读和不可重复读

1.数据脏读 事务a修改了某条数据,然后事务b读取了事务a修改的该条数据,然后事务a由于某些原因,事务a回滚了,这样事务b读到的数据就和回滚的数据不同了,这时事务b读取的数据就是脏数据. 概括来讲:就是一个事务读取了另一个事务未提交的数据. 2.数据幻读 事务a按一定条件读取了该表的一些数据,然后事务b想该表插入了一些满足事务a查询条件的数据,当事务a再次以相同条件查询数据时,会发现多出来一些数据,就好像产生了幻觉一样,我们称为幻读. 概括来讲,就是一个事物的两次查询,出现的查询数目不一致的情况

幻读和不可重复读的区别

不可重复读的重点是修改:  同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 幻读的重点在于新增或者删除  同样的条件, 第1次和第2次读出来的记录数不一样当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致. 但如果你从控制的角度来看, 两者的区别就比较大  对于前者, 只需要锁住满足条件的记录  对于后者, 要锁住满足条件及其相近的记录 不可重复读重点在于update幻读重点在于insert,delete

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制

首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行. (2) C:一致性(Consistency) 事务完成时,数据必须处于一致的状态.若事务执行途中出错,会回滚到之前的事务没有执行前的状态,这样数据就处于一致的状态.若事务出错后没有回滚,部分修改的内容写入到了数据库中,这时数据就是不一致的状态. (3) I:隔离性(Isolation) 同时处理多个事务时

事务隔离级别区分,未提交读,提交读,可重复读

事务隔离超通俗好懂的的讲解 按照隔离的级别由低到高,越高的隔离,效率越差 0).DEFAULT 默认隔离级别,由数据库的数据隔离级别确定隔离级别       1).READ_UNCOMMIYTTED 都未提交的 级别最低             允许别的事务,去读取这个事务为提交之前的数据             缺点:可能会造成脏读.幻读.不可重复读.             例子讲解:店家对1000元商品进行降价500处理,数据更改,但未提交事务:             然后你查到降价将货