脏读、不可重复读、虚(幻)读

一、常见三种数据库错误类型

脏读:一个未提交的事务读取到了另一个未提交事务的数据。

不可重复读:事务A第一次读取数据,事务B对同一个表进行了update或delete(修改操作),事务A第二次读取数据,那么两次读取的数据是不同的,这时是不可重复读。

幻(虚)读:事务A第一次读取数据,事务B对同一个表进行了insert(添加操作),事务A第二次读取数据,那么两次读取的数据是不同的,这时是幻读。

 

1.脏读:

脏读是指一个事务在处理数据的过程中,读取到另一个未提交事务的数据。

2.不可重复读:

不可重复读是指对于数据库中的某个数据,一个事务范围内的多次查询却返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了。

 

不可重复读和脏读的区别是,脏读读取到的是一个未提交的数据,而不可重复读读取到的是前一个事务已提交的数据。

而不可重复读在一些情况也并不影响数据的正确性,比如需要多次查询的数据也是要以最后一次查询到的数据为主。

3.幻读:

幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,

而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。


幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

4、提醒
不可重复读的重点是修改:
同样的条件,你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者除:
同样的条件,第 1 次和第 2 次读出来的记录数不一样

5、第一类丢失更新

A事务撤销时,把已经提交的B事务的更新数据覆盖了。例如:

这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新。
在这里插入图片描述

6、第二类丢失更新

A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失
在这里插入图片描述

二、事务特性

事务包括四大特性:ACID

    A:原子性:事务是最小的工作单元,不可再分。
    C:一致性:事务必须保证多条DML语句同时成功或者同时失败。
    I:隔离性:事务A与事务B之间具有隔离。
    D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

三、事务隔离级别

事务隔离性隔离级别,理论上隔离级别包括4个:

    第一级别:读未提交(READ UNCOMMITTED):对方事务还没有提交,我们当前事务就可以读取到对方未提交的数据。读未提交存在脏读现象:表示读到了脏的数据。
    第二级别:读已提交(READ COMMITTED):对方事务提交之后的数据我方可以读取到。这种隔离级别解决了脏读现象。存在的问题:不可重复读。
    第三级别:可重复读(REPEATABLE READ)这种隔离级别解决了:不可重复读问题。存在问题:读取到的数据是幻象。
    第四级别:序列化/串行化读(SERIALIZABLE),解决所有的问题,但效率低。需要事务排队。

    Oracle数据库默认的隔离级别是读已提交

    MySQL数据库默认的隔离级是可重复读

 

posted on 2022-04-22 17:20  HHHuskie  阅读(915)  评论(0编辑  收藏  举报

导航