脏读 幻读 不可重复读

转自:http://www.blogjava.net/hitlang/archive/2009/04/13/265256.html

1, 脏读

一个事务读到另一个事务,尚未提交的修改,就是脏读。这里所谓的修改,除了Update操作,不要忘了,还包括
Insert和Delete操作。

脏读的后果:如果后一个事务回滚,那么它所做的修改,统统都会被撤销。前一个事务读到的数据,就是垃圾数据。

举个例子:预订房间。
有一张Reservation表,往表中插入一条记录,来订购一个房间。

事务1:在Reservation表中插入一条记录,用于预订99号房间。

事务2:查询,尚未预定的房间列表,因为99号房间,已经被事务1预订。所以不在列表中。

事务1:信用卡付款。由于付款失败,导致整个事务回滚。
        所以插入到Reservation 表中的记录并不置为持久(即它将被删除)。

现在99号房间则为可用。
所以,事务2所用的是一个无效的房间列表,因为99号房间,已经可用。如果它是最后一个没有被预定的房间,那么这将是一个严重的失误。

注:脏读的后果很严重。

2,不可重复读。

在同一个事务中,再次读取数据时【就是你的select操作】,所读取的数据,和第1次读取的数据,不一样了。就是不可重复读。

举个例子:
 事务1:查询有双人床房间。99号房间,有双人床。

事务2:将99号房间,改成单人床房间。

事务1:再次执行查询,请求所有双人床房间列表,99号房间不再列表中了。也就是说,
               事务1,可以看到其他事务所做的修改。

在不可重复读,里面,可以看到其他事务所做的修改,而导致2次的查询结果不再一样了。
这里的修改,是提交过的。也可以是没有提交的,这种情况同时也是脏读。

如果,数据库系统的隔离级别。允许,不可重复读。那么你启动一个事务,并做一个select查询操作。
查询到的数据,就有可能,和你第2次,3次...n次,查询到的数据不一样。一般情况下,你只会做一次,select
查询,并以这一次的查询数据,作为后续计算的基础。因为允许出现,不可重复读。那么任何
时候,查询到的数据,都有可能被其他事务更新,查询的结果将是不确定的。

注:如果允许,不可重复读,你的查询结果,将是不确定的。一个不确定的结果,你能容忍吗?

3,幻读

事务1读取指定的where子句所返回的一些行。然后,事务2插入一个新行,这个新行也满足事务1使用的查询
where子句。然后事务1再次使用相同的查询读取行,但是现在它看到了事务2刚插入的行。这个行被称为幻象,
因为对事务1来说,这一行的出现是不可思议的。

举个例子:
事务1:请求没有预定的,双人床房间列表。
事务2:向Reservation表中插入一个新纪录,以预订99号房间,并提交。
事务1:再次请求有双人床的未预定的房间列表,99号房间,不再位于列表中。

注:幻读,针对的是,Insert操作。如果事务2,插入的记录,没有提交。那么同时也是脏读。

时间: 2024-10-12 12:22:33

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

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

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

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

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

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

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

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

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

[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,才能读取到,听上去蛮靠谱的.但是有些业务场景,比如会员系统中,如果要在一个事务中,多次读取用户身份,判

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

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

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

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

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

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 +