关于脏读、幻象读、不可重复读的理解

一般大家都对事务的四种隔离模式比较熟悉,从松到严依次是:

- 读取未提交(Read uncommitted):处于此模式下可能会出现脏读、幻象读、不可重复读

- 读取已提交(Read committed):处于此模式下可能会出现幻象读、不可重复读

- 可重复读(Repeatable read):处于此模式下可能会出现幻象读

- 串行(Serialize):不会出现幻象读

那么脏读、幻象行、不可重复读是什么意思呢?

- 脏读:其它的事务(执行单个 select 语句也算一个事务)可以读取到某个事务更新(包括插入和删除)了但未提交的数据。脏读是应用中应该避免的,因为读取的是不可靠的数据(我觉得把这个叫做幻象行更形象,实际却不是)。一般数据库不会设定为这个模式,但有时候也会用到。脏读的好处是读取时不会对表或记录加锁,可以绕开写队列的排队,避免了等待。如在一个更新特别频繁的表中要选择表中所有的数据,就可以显示指定隔离级别:

select .... at isolation 0

- 不可重复读:这是描述在同一个事务中两条一模一样的 select 语句的执行结果的比较。如果前后执行的结果一样,则是可重复读;如果前后的结果可以不一样,则是不可重复读。这个特性从字面上也能看出来。

不可重复读的模式下首先不会出现脏读,即读取的都是已提交的数据。在一个事务中,读取操作是不会加排他锁的,当下一条一模一样的 select 语句的执行时,命中的数据集可能已经被其它事务修改了,这时候,还能读到相同的内容吗?

因此,要达到可重复读的效果,数据库需要做更多的事情,比如,对读取的数据行加共享锁,并保持到事务结束,以禁止其它事务修改它。这样会降低数据库的性能。而隔离级别的串行则比可重复读更严格。一般数据库的的隔离级别只设置到读取已提交。这是兼顾了可靠性和性能的结果。

上面还只提到了对命中的数据行加锁,以防止其它事务修改它。但没有提到,如果其它事务增加了符合条件的数据行怎么办?有些数据库对这种情况新定义了两个级别:读取稳定性和游标稳定性。前者不限制新增符合条件的数据行,而后者则阻止新增这样的数据行。

- 幻象读:是指两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中。一般情况下,幻象读应该正是我们所需要的。但有时候却不是,如果打开的游标,在对游标进行操作时,并不希望新增的记录加到游标命中的数据集中来。隔离级别为 游标稳定性 的,可以阻止幻象读。

时间: 2024-10-03 10:53:11

关于脏读、幻象读、不可重复读的理解的相关文章

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

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

脏读 幻读 不可重复读

转自:http://www.blogjava.net/hitlang/archive/2009/04/13/265256.html 1, 脏读 一个事务读到另一个事务,尚未提交的修改,就是脏读.这里所谓的修改,除了Update操作,不要忘了,还包括Insert和Delete操作. 脏读的后果:如果后一个事务回滚,那么它所做的修改,统统都会被撤销.前一个事务读到的数据,就是垃圾数据. 举个例子:预订房间.有一张Reservation表,往表中插入一条记录,来订购一个房间. 事务1:在Reserva

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍微力度控制不好就超过了我目前知识能力范围,就不是三言两语能够讲清楚的.所以希望大家能够指出其中总结的不足之处,对我

数据库事务处理差异:可提交读和重复读区别

本文来自于自己的博客:http://www.wangerbao.com/?p=279 Mysql默认事物是重复读(Repeatable Read Isolation Level), PostGres默认事物是提交读(Read Committed Isolation Level),现在根据实例来对比下它们的差别. Mysql: 左边为事物1,右边为事物2. 第一步: 事物1查询,事物2查询,它们的查询结果一致.  第二步: 事物1更新-查询-但是不提交,事物2查询,他们的结果不一致 第三步: 事物

关于数据库事务中脏读、不可重复读和幻读的理解

数据库有四种隔离级别,分别是: SOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读.不可重复读和幻读. ISOLATION_READ COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读. ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读. ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读.不可重复读和幻读. 四种不同的隔离级别代表着数据库对资

脏读,不可重复读,幻读讲解

首先我们先讨论一下问题,是不是在ACID的保护下,数据就一定不会产生不一致的现象呢? 在关系数据库库系统中,多个会话可以访问同一个数据库的同一个表的同一行,这样,对于数据而言,就意味着在同一个时间内,有多个会话可以对其施加操作(或读操作或写操作),读写操作施加的顺序不停以及事务A特性对事务结果的影响(或成功或失败,也就是要不提交要不中止).这三种因素叠加在一起,会存在几种对数据有不同影响的情况 读-读操作 如果同时只存在多个读操作,对于数据没有影响,也就是说读-读操作不影响数据的一致性,可以并发

[MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解与数据库事务隔离级别 - 分析脏读 & 不可重复读 & 幻读

刚开始写博客.. 写的太low. 1.数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC,即多版本并发控制 a) 快照读 select * from where xxx  这种形式的都是快照读. b) 当前读 update , insert ,delete ,select xx from xx for update ,  in share mode 都是当前读 当前读会等待,不会返回数据的历史版本 2.mvcc 的实现原理 mvcc是基于read view.活跃事务列表 做的,以后的文

mysql事务隔离级别/脏读/不可重复读/幻读详解

一.四种事务隔离级别 1.1 read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔离级别,标准实在太宽松了. 1.2 read committed 读已提交(简称RC) 即:事务A只能读取到事务B修改并已提交的数据. 这个级别相对要严格一些,至少是要等其它事务把变更提交到db,才能读取到,听上去蛮靠谱的.但是有些业务场景,比如会员系统中,如果要在一个事务中,多次读取用户身份,判

事务的隔离级别的演示:避免脏读和不可重复读的发生

1.1.1 避免脏读,演示不可重复读发生l 开启两个窗口A,Bl 设置A窗口的隔离级别为read committed;SET SESSION TRANSACTION ISOLATION LEVEL read committed;l 分别在两个窗口中开启事务:start transaction;l 在B窗口中完成转账update account set money = money - 1000 where name= '小张';update account set money = money +