读脏数据、不可重复读、幻读

本文详细解释了数据库事务处理中常见的三种问题:脏读、不可重复读及幻读。通过具体场景说明这些现象如何发生,以及可能带来的数据一致性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库中读数据的一些概念:

(1)脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

(2)不可重复读:这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

(3)幻读:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。

### 脏、可重复不可重复的概念及区别 #### 1. 脏 (Dirty Read) 脏是指一个事务取了另一个事务未提交的数据。这种情况会导致取到的数据可能是无效的或错误的,因为另一个事务可能会回滚其更改。在 SQL 标准中,`READ UNCOMMITTED` 隔离级别允许脏[^1]。 #### 2. 不可重复 (Non-Repeatable Read) 不可重复是指在一个事务内多次取同一数据时,由于其他事务对该数据进行了修改并提交,导致取结果不一致。这种问题在 `READ COMMITTED` 隔离级别下可能发生,因为它虽然防止了脏,但不能保证多次取的一致性[^2]。 #### 3. (Phantom Read) 是指一个事务在执行相同查询时,由于其他事务插入或删除了数据,导致两次查询的结果集不同。不可重复的区别在于,涉及的是新插入或删除的行,而不是现有行的修改。在 `REPEATABLE READ` 隔离级别下,虽然解决了不可重复问题,但仍可能出现[^3]。 #### 4. 可重复 (Repeatable Read) 可重复是指在一个事务内多次取同一数据时,结果始终保持一致。这是因为在该隔离级别下,事务开始后取的数据会被锁定,防止其他事务对其进行修改。`REPEATABLE READ` 解决了不可重复问题,但在某些情况下仍可能遇到[^4]。 ### 数据库事务隔离级别 SQL 标准定义了四种隔离级别,每种级别解决不同的事务隔离问题: 1. **READ UNCOMMITTED**:最低的隔离级别,允许脏不可重复。 2. **READ COMMITTED**:解决了脏问题,但仍可能出现不可重复。 3. **REPEATABLE READ**:解决了脏不可重复问题,但仍可能出现。 4. **SERIALIZABLE**:最高的隔离级别,解决了脏不可重复问题,但性能开销较大。 ### 示例代码 以下是一个简单的事务隔离级别设置示例(以 MySQL 为例): ```sql -- 设置事务隔离级别为 REPEATABLE READ SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 开始事务 START TRANSACTION; -- 查询数据 SELECT * FROM table_name WHERE condition; -- 提交事务 COMMIT; ``` ### 锁机制 InnoDB 存储引擎通过锁机制实现事务隔离。常见的锁类型包括共享锁(S锁)和排他锁(X锁)。共享锁允许其他事务取被锁行,但禁止修改;排他锁则禁止其他事务取或修改被锁行。此外,InnoDB 的行级锁依赖于索引,若无索引可用,则会退化为表级锁,影响并发性能[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值