脏读,幻读,不可重复读

博客介绍了数据库中的脏读、不可重复读和幻读问题。脏读是事务A两次查询因事务B未提交修改而结果不同,用读提交可解决;不可重复读重点在修改删除,需可重复读和行加锁;幻读重点在增加,需串行化和表加锁。还说明了不同隔离级别对这些问题的影响。
部署运行你感兴趣的模型镜像

脏读,不可重复读,幻读

脏读:事物a开启,查询第一次数据,事物b开启,修改了数据,但是没提交,事物a又一次查数据,两次查到的不一样。
这里用read commited(读提交)就可以解决。

不可重复度:重点是修改(update)和删除(delete),事物a开启,查询第一次数据,事物b开启,修改数据并且提交,事物a又查了一次数据,发现数据改变,需要repeatable read才能解决问题。这种情况对行加锁就能避免。

幻读:重点是(insert)增加,事物a开启,查询第一次数据,事物b开启,对数据进行了增加,a事物再查,发现两次查询结果不一样,需要serializable才能解决问题。这种情况对表加锁才能避免。

读未提交read uncommitted 脏读 不可重复读 幻读 都会出现
读提交read committed 脏读避免; 不可重复读 幻读 会出现
可重复读repeatable read 脏读 不可重复读 避免; 幻读 会出现
串行化serializable 脏读 不可重复读 幻读 都可以避免

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

数据库事务处理中,**不可重复**是并发事务执行过程中可能出现的三种数据一致性问题。它们分别涉及不同层次的数据取不一致,而**事务隔离级别**则用于控制这些问题的发生。 ### 事务隔离级别与并发问题的关系 数据库系统提供了四种标准的事务隔离级别,从低到高依次为: 1. **未提交(Read Uncommitted)** - 允许一个事务取另一个事务尚未提交的数据。 - 可能引发:**不可重复**。 2. **已提交(Read Committed)** - 一个事务只能取已经提交的数据。 - 可防止:****。 - 可能引发:**不可重复**。 3. **可重复(Repeatable Read)** - 确保在同一个事务中多次取同一数据时结果一致。 - 可防止:**不可重复**。 - 可能引发:****(部分数据库如 MySQL InnoDB 通过 Next-Key Lock 避免)。 4. **串行化(Serializable)** - 所有事务串行执行,避免并发问题。 - 可防止:**不可重复**。 ### 各类并发问题的定义与区别 #### (Dirty Read) - **定义**:事务取了其他未提交事务修改的数据。 - **示例**: - 事务 A 修改了某条记录但未提交。 - 事务 B 取了该记录。 - 若事务 A 回滚,事务 B 取的数据即为无效数据。 - **影响**:可能导致基于无效数据的错误操作。 #### 不可重复(Non-Repeatable Read) - **定义**:同一事务中多次取同一数据,结果不一致。 - **示例**: - 事务 A 取某行数据。 - 事务 B 修改该行并提交。 - 事务 A 再次取该行,结果不同。 - **影响**:事务在执行过程中感知到数据的“变化”,导致逻辑错误。 #### (Phantom Read) - **定义**:同一事务中多次执行相同查询,结果集不同。 - **示例**: - 事务 A 查询某范围内的所有记录。 - 事务 B 插入或删除该范围内的记录并提交。 - 事务 A 再次执行相同查询,发现记录数量变化。 - **影响**:事务认为自己操作的是一个稳定的集合,但实际集合被其他事务改变。 ### 隔离级别与并发问题对照表 | 隔离级别 | | 不可重复 | | |------------------|------|-------------|------| | Read Uncommitted | 是 | 是 | 是 | | Read Committed | 否 | 是 | 是 | | Repeatable Read | 否 | 否 | 可能 | | Serializable | 否 | 否 | 否 | ### 实现机制差异 不同的数据库系统可能采用不同的机制来实现这些隔离级别: - **MySQL InnoDB** 使用 **MVCC(多版本并发控制)** 实现 `Repeatable Read`,并通过 **Next-Key Locks** 来防止。 - **Oracle** 默认使用 `Read Committed` 隔离级别,并通过 **一致性** 实现。 - **PostgreSQL** 支持所有标准隔离级别,并通过 MVCC 实现高并发下的数据一致性。 ### 代码示例:不可重复演示 ```sql -- 事务 A BEGIN; SELECT balance FROM accounts WHERE id = 1; -- 假设返回 1000 -- 事务 B BEGIN; UPDATE accounts SET balance = 900 WHERE id = 1; COMMIT; -- 事务 A SELECT balance FROM accounts WHERE id = 1; -- 返回 900 COMMIT; ``` 在这个例子中,事务 A 在两次查询中取了不同的值,这就是不可重复的问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值