首页 > 编程知识 正文

数据库的脏读,幻读不可重复读,数据库的幻读和脏读

时间:2023-05-05 16:13:22 阅读:183626 作者:425

概念 一个数据库事务通常包含了一个序列的对数据库的读/写操作 事务存在目的

为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰

事务的执行过程

当一个事务被提交给了DBMS(数据库管理系统)

要么全执行,要么全都不执行

该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行

产生的便利性

为了当应用程序访问数据库的时候

事务能够简化我们的编程模型

不需要我们去考虑各种各样的潜在错误和并发问题

事务本质上是为了应用层服务的.而不是伴随着数据库系统天生就有的

使用事务时,要么提交,要么回滚, 我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办的问题

数据库事务的四大特性(ACID) 一个支持事务(Transaction)的数据库,必需要具有这四种特性, 否则在事务过程(Transaction processing)当中无法保证数据的正确性 原子性(Atomicity)

事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
记录之前的版本,允许回滚

一致性(Consistency)

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。 一致状态的含义是数据库中的数据应满足完整性约束

从一个一致性的状态到另一个一致性状态,而不可能出现中间的过程态

事务开始和结束之间的中间状态不会被其他事务看到

中间状态的问题

第一秒访问的人和第三秒访问的人得到不同的结果?

特征

ACID里的AID都是数据库的特征

唯独这个C,实际上它依赖于应用层,也就是依赖于开发者

隔离性(Isolation)

多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

由于多个事物可能操作同一个资源,不同的事物为了保证隔离性,会有很多锁方案

适当的破坏一致性来提升性能与并行度 例如:最终一致~=读未提交

持久性(Durability)

一个事务一旦提交,他对数据库的修改应该永久保存在数据库中



脏读(dirtyRead)

脏读是指的一个事物正在访问数据,并且对数据进行了修改,

而且这种修改还没有提交到数据库中

这时,另一个事物也访问这个数据 ,然后使用了这个数据

因为这个数据还没有提交数据,那么另外一个事物读到的这个数据就是脏数据

不可重复读

不可重复读针对的是同一个主键的数据。

在同一事务中,两次读取同一数据(同一主键),得到内容不同

虚读(幻读)

同一事务中,用同样的操作读取两次,得到的记录数不相同

幻读针对的是一批数据两次读取中,有新增或者减少

三者的区别 针对点

幻读针对的是一批数据两次读取中,有新增或者减少

不可重复读针对的是同一个主键的数据。

脏读针对读取了未提交数据

幻读和不可重复读都是读取到了另一条已经提交的事物,这一点和脏读不同

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。