数据库脏读和幻读

### 的定义与区别 #### 定义 - ****指的是在一个事务中取到了另一个尚未提交事务修改的数据。这种现象通常发生在隔离级别较低的情况下,例如 `READ UNCOMMITTED` 隔离级别下[^3]。 - ****则是指在一个事务内多次查询同一范围的数据时,由于其他事务新增或删除记录而导致结果集不一致的情况。这种情况可能出现在较高隔离级别下的某些场景中,但可以通过更严格的隔离机制来避免[^4]。 #### 区别 | 特性 | | | |-----------------|-----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | 发生原因 | 取了未提交事务中的更改数据 | 查询范围内因其他事务插入/删除操作而出现了新的记录 | | 影响的表现 | 导致取到错误或者临时性的数据 | 结果集中行数变化 | | 解决方法 | 提高隔离级别至至少 `READ COMMITTED` | 使用更高隔离级别如 `SERIALIZABLE` 或者采用机制 | #### 数据库事务隔离级别概述 数据库提供了多种事务隔离级别以应对不同的需求: - 在最低级 `READ UNCOMMITTED` 下允许出现、不可重复以及等问题; - 升级到 `READ COMMITTED` 后能够防止但仍可能发生不可重复; - 到达 `REPEATABLE READ` 层次,则进一步解决了不可重复问题却仍存在风险; - 只有达到最高层次 `SERIALIZABLE` 才能完全杜绝以上三种异常情况的发生[^1]。 ```sql -- 设置 MySQL 的事务隔离级别为例 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION; SELECT * FROM table_name WHERE condition; -- 此处不会受到其它事务的影响 COMMIT; ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值