数据库的脏读、不可重复读、幻读以及不可重复读和幻读的区别

介绍


数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性,事务的4大特性(ACID):

原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。
一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束
隔离性(Isolation):并发执行的N个事务是隔离的,一个不影响一个,一个事务在没有commit之前,被修改的数据不可能被其他事务看到(通过设置数据库的隔离级别)。
持久性(Durability):持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性主要在于DBMS的恢复性能。

脏读:脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。

例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的,造成数据错乱了。

解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(允许并发事务提交后读取,但幻读、不可重复读还是不能避免。)

不可重复读:不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。

例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ(对相同字段多次读取是一致的,除非数据被事务本身改变。幻读问题仍在)

幻读:事务在插入已经检查过不存在的记录时,惊奇的发现这些数据已经存在了,之前的检测获取到的数据如同鬼影一般。

例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A修改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。

解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(完全锁定在事务中中涉及到的数据库表来实现)

脏读、不可重复读、幻读的级别高低是:脏读 < 不可重复读 < 幻读。所以,设置了最高级别的SERIALIZABLE_READ就不用再设置REPEATABLE_READ和READ_COMMITTED了。


区别

不可重复读

不可重复读的重点是修改(本事务进行中,另一事务修改了本事务读取的数据,再读就数据内容变了)。同样的条件, 你读取过的数据, 再次读取出来发现值不一样了

例子:在事务1中,Mary 读取了自己的工资为1000,操作并没有完成

--在postresql中的例子,可能和其他的数据库略有区别
begin transaction;
select salary from employee
where id = MaryID;
  • 1
  • 2
  • 3
  • 4

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

begin transaction;
update employee
set salary = 2000
where id = MaryID;
commit;
  • 1
  • 2
  • 3
  • 4
  • 5

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

select salary 
from employee
where id = MaryID;
  • 1
  • 2
  • 3

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

幻读

幻读的重点在于新增或者删除(本事务中另一事务增加/删除了查询的数据,读取的数据数量变了)。同样的条件, 第1次和第2次读出来的记录数不一样

例子:目前工资为1000的员工有10人。事务1,读取所有工资为1000的员工。

begin transaction;
select * from employee
where salary = 1000;
-- 共读取10条记录 
  • 1
  • 2
  • 3
  • 4

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

begin transaction;
insert into employee(,salary,)
values(,1000,);
commit;
  • 1
  • 2
  • 3
  • 4

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

--事务1
select * from employee
where salary = 1000;
--共读取到了11条记录
  • 1
  • 2
  • 3
  • 4

这就产生了幻像读。

猜你喜欢

转载自blog.csdn.net/weixin_39214481/article/details/80838592