`

脏读 幻读 不可重复读

 
阅读更多
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,插入的记录,没有提交。那么同时也是脏读。
分享到:
评论

相关推荐

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

    数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。  事务的4大特性(ACID):  1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么...

    并发控制指的是当多个用户同时更新行时,用于保护数据库完整性的各种技术。并发机制不正确可能导致脏读、幻读和不可重复读等此类问题。

    并发控制指的是当多个用户同时更新行时,用于保护数据库完整性的各种技术。并发机制不正确可能导致脏读、幻读和不可重复读等此类问题。

    .NET中 关于脏读 不可重复读与幻读的代码示例

    本篇文章小编将为大家介绍,.NET中 关于脏读 不可重复读与幻读的代码示例,有需要的朋友可以参考一下

    MySQL可重复读级别能够解决幻读吗

    关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读,我发现在可重复读的隔离级别下没有出现,当时想到难道是MySQL对幻读做了什么处理? 测试: 创建一张测试用的表dept: CREATE TABLE `dept`...

    数据库锁(行锁,表锁,共享锁,排他锁)脏读、不可重复读、幻读和事物隔离级别

    数据库锁(行锁,表锁,共享锁,...顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作。表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张

    详解MySQL是如何解决幻读的

    如果你看到了这篇文章,那么我会默认你了解了 脏读 、不可重复读与可重复读。 1. 多版本并发控制(MVCC)(快照读) 多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。 以 InnoDB 为例,每一行...

    事务隔离级别和脏读的快速入门

    脏读可导致同一记录得到两个版本,或是完全地丢失一条记录。在同一事务中多次重新运行同一查询后,可能会出现幻读。最近MongoDB登上了Reddit的头条,因为MongoDB的核心开发者DavidGlasser痛苦地认识到MongoDB默认会...

    MySQL数据库事务隔离级别详解

    数据库事务隔离级别 ...这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 √: 可能出现 ×: 不会出现 事务级别 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed

    4种事务的隔离级别

    (2)读提交(RC):普通select快照读,锁select /update /delete 会使用记录锁,可能出现不可重复读; (3)可重复读(RR):普通select快照读,锁select /update /delete 根据查询条件情况,会选择记录锁,或者间隙锁/临键...

    事务并发控制

    并发机制不正确可能导致脏读、幻读和不可重复读等此类问题。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。在某些情况下,这些措施保证了当用户和其他用户一起操作时,所得的结果和她...

    悲观锁和乐观锁.md

    所谓悲观锁,总是假设最坏的情况,每次去拿数据的时候都会认为别人会修改数据,造成幻读,不可重复读,脏读等情况发生。所谓乐观锁,重视假设最好的情况,每次去拿数据都认为别人不会修改,所以不会上锁,但是会在...

    Sixah#Server#09-事务1

    2.1 自动提交 2.1 commit与 commit and chain 3.1 读未提交--脏读 3.2 读已提交--不可重复读 3.3 可重复读--幻读

    数据库事务

     ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。  ③ Read committed (读已提交):可避免脏读的发生。  ④ Read ...

    java-数据库系统原理.docx

    并发访问问题 事务隔离级别 丢失修改 MySQL 所有事务隔离级别在数据库层面上均可避免 脏读 READ-COMMITTED 事务隔离级别以上可避免 不可重复读 REPEATABLE-READ 事务隔离级别以上可避免 幻读 SERIALIZABLE 事务隔离...

    MySQL的四种事务隔离级别

    MySQL的四种事务隔离级别 1、脏读 2、不可重复读 3、幻读

    数据库事务的四大特征以及隔离级别

    1. 事务的四大特征(ACID) 原子性(Atomicity):事务包含所有操作要么全部成功,要么全部回滚。 一致性(Consistency):一个事务执行之前和...Serializable(串行化):可避免脏读、不可重复读、幻读的发生。 Rep

    MySQL面试题经典40问!(全)(含答案解释)

    5、什么是脏读、不可重复读、幻读呢? 6、 datetime 和 timestamp 的区别? 7、 varchar 和 char 有什么区别? 8、 count(1)、 count(*) 与 count(列名) 的区别? 9、 exist 和 in 的区别? 10、 truncate、 delete ...

    Java面试Mysql.pdf

    脏读、不可重复读、幻读 事务的隔离级别? 怎么优化数据库 SQL优化 大表数据查询,怎么优化 常用的聚合函数 13. 百万级别或以上的数据如何删除 锁 对MySQL的锁了解吗 隔离级别与锁的关系 按照锁的粒度分数据库锁有...

Global site tag (gtag.js) - Google Analytics