详解-脏读、幻读与不可重复读

数据库事务特征

数据库事务特征,即 ACID:

A:Atomicity 原子性

事务的各个操作步骤在数据库中是不可分割的(原子的),事务里面的对数据库的操作要么都执行,要么都不执行。

eg:银行转账

 

C:Consistent 一致性

在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。或者可以这么理解:一个事务查询的结果必须与数据库查询开始的状态一致

eg:9:00开始读取数据,9:15读完,其中的这15分钟对于数据如何操作,最终查询的结果显示的都是9:00的数据

 

I:Isolation 隔离性

数据库允许多个并发事务同时对数据进行操作,未完成提交的事务对数据库的操作其他事务不可见。为此防止出现数据不一致状态,可通过事务隔离级别设置:包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

eg:
  会话t1:---操作数据库    
               不进行事务的提交,就是相互隔离的
  会话t2:---操作数据库  

 

D:Durable 持久性

 

对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

 

MySQL 数据隔离级别

首先 MySQL 里有四个隔离级别:Read uncommttied(可以读取未提交数据)、Read committed(可以读取已提交数据)、Repeatable read(可重复读)、Serializable(可串行化)。

在 InnoDB 中,默认为 Repeatable 级别,InnoDB 中使用一种被称为 next-key locking 的策略来避免幻读(phantom)现象的产生。

可以查看 MySQL 默认的事务隔离级别。

select @@tx_isolation; 

 

不同的事务隔离级别会导致不同的问题:

 

脏读、幻读、不可重复读的概念

脏读

指一个事务中访问到了另外一个事务未提交的数据

我个人理解是所读取的数据是“脏”的,或者说是不真实的,不具有真实性。

 

幻读

所谓幻读,可以理解为在执行SQL语句时好像出现了“幻觉”一样。例如原来读一整张表只有5条数据,但是第二次读的时候有10条,即读取到了另一个事务提交的插入操作,事务T1前后两次执行一样的语句却出现了不同的结果,这就好比出现了“幻觉”一样,这就是幻读的定义。

 

不可重复读

指的是同一个事务在一段时间内读取同一数据时显示了不同的结果,即:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

 

posted @ 2022-04-26 21:25  编程小白1024  阅读(67)  评论(0编辑  收藏  举报