不可重复读与幻象读的区别 (unrepeatable read与phantom read)

本文介绍了数据库事务隔离级别中的不可重复读与幻象读现象,探讨了Oracle数据库在这方面的处理。由于read uncommitted级别在Oracle中不被支持,且repeatable read和serializable read在性能上逊于read commited,因此在实际开发中通常选择read commited级别。
不可重复读 幻象读
两次读取之间,其他事务对于某一行数据的修改或者删除造成

两次读取之间,其他事务添加了一行数据
行级锁可以解决 表级锁才可以解决
### 可重复(Repeatable Read)概述 可重复是数据库事务隔离级别之一,位于SQL标准定义的四个隔离级别中的第三级[^1]。它确保在一个事务中多次执行相同的查询时返回相同的结果集,即使其他事务对数据进行了修改并提交了更改。 然而,在Repeatable Read隔离级别下,尽管能够防止不可重复的发生,但仍可能面临幻的问题[^3]。这是因为此隔离级别仅通过锁定已取的数据行来阻止其他事务更新或删除这些特定记录,但它无法阻止新记录被插入到满足查询条件的位置,从而可能导致幻现象发生[^2]。 #### 幻不可重复区别 不可重复主要涉及`UPDATE`和`DELETE`操作的影响;而幻则是由于`INSERT`操作引起的。为了防止不可重复,可以通过加行锁的方式实现——即某个事务首次访问某些数据之后便将其锁定,这样别的事务就不能再对该部分数据做任何改动直至当前事务结束为止。但是这种策略对于新增加的数据无效,因此即便采取上述措施也无法杜绝可能出现的新纪录干扰原有结果的情况,也就是所谓的“幻影”。只有达到最高级别的隔离度—序列化(Serializable),才能真正意义上消除包括幻在内的所有潜在风险因素。 ### 解决方案:Serializable 隔离级别 如果希望完全规避掉像幻这样的问题,则需采用更严格的 Serializable 隔离等级来进行处理。在这个层次上,每次取都会施加重叠范围上的共享锁(Shared Locks), 而每一次写入都将获取排他性的独占锁 (Exclusive Lock) 。 这样一来, 不同交易之间相互作用受到严格控制 , 尽管能有效保障资料一致性以及准确性, 却不可避免地牺牲掉了相当程度上的系统性能表现 和 吞吐量效率 [^4]. ```sql SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRAN; -- Your SQL statements here... COMMIT TRAN; ``` 以上代码展示了如何设置事务为 `SERIALIZABLE` 模式,并启动一个新的显式事务块。在此模式下的所有操作都遵循最高等级的安全协议以维护整体数据状态的一致性和可靠性。 ### 总结 虽然 Repeatable Read 提供了一个相对较高的保护屏障用来对抗大多数常见的并发冲突情况比如脏(Dirty Reads) 或者 是非重覆性阅(Unrepeatable Reads),但对于那些特别敏感的应用场景来说仍然不够充分因为它们依旧存在遭遇所谓 “幽灵” 记录的可能性。 若要彻底根除这类隐患就必须升级至 Serializability 层面才行不过这通常意味着付出更多成本代价如更低效的服务响应速度等等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值