脏读 幻读 不可重复读简析

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号房间,不再位于列表中。


那么 幻读和不可重复读 有什么区别呢



不可重复读
不可重复读的重点是修改:
同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
例子:
在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 


在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 


在事务1中,Mary 再次读取自己的工资时,工资变为了2000


在一个事务中前后两次读取的结果并不致,导致了不可重复读。


幻读
幻读的重点在于新增或者删除
同样的条件, 第1次和第2次读出来的记录数不一样
例子:
目前工资为1000的员工有10人。 
事务1,读取所有工资为1000的员工。 


共读取10条记录 

这时另一个事务向employee表插入了一条员工记录,工资也为1000


事务1再次读取所有工资为1000的员工 



共读取到了11条记录,这就产生了幻像读。 


Spring的事务和 数据库的事务有什么关系呢???


基于元数据的 Spring 声明性事务 :


Isolation 属性一共支持五种事务设置,具体介绍如下:


l          DEFAULT 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .


l          READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )


l          READ_COMMITTED  会出现不可重复读、幻读问题(锁定正在读取的行)


l          REPEATABLE_READ 会出幻读(锁定所读取的所有行)


l          SERIALIZABLE 保证所有的情况不会发生(锁表)


参考博文:http://blog.csdn.net/fatherican/article/details/44966921

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值