多版本模型与一致性读
一致性读
当select
查询接触到一个被X
锁的块时,Oracle
绕开锁,并从回滚段中重构数据;
以实现数据的一致读。
Oracle
自动在查询上提供读一致性以使查询所能看到的数据均来自一个时间点上。
同样,ORACLE
也提供事务中所有查询的一致性,如你的update
就是一个事务。
Oracle
为保证一致性用回滚段来保存未提交或最近已提交的数据的旧值。
当查询进行的时候.
当前SCN
已被决定,因此, 每个查询返回所有截止于在查询执行点上的那个SCN
的所有提交的数据,在查询期间发生的其他事务改变不会被用到。
因此如果在查询前提交该事务.
那么数据是可见的。
读取操作只会读取读取查询开始时那一时刻的数据,如果数据在读取操作以后发生了变化,则从回滚段中读取old image
。
例子
假设表A
的col1
的值初始为9
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
Select col1 from
A where id=1
(
值为9)
|
T3
|
Update A set
col1=2 where id=1
|
|
T4
|
|
Select col1 from
A where id=1
(
值为9)
|
T5
|
commit
|
|
T6
|
|
Select col1 from
A where id=1
(
值为2)
|
假设查询开始时间为
T1
,则在查询获取的数据块中,如果数据块的提交
SCN
小于
T1
,则
oracle
接收该数据,如果提交
SCN
大于
T1
或数据被锁定修改尚未记录
commit SCN
,则
oracle
需要通过回滚段构造前镜像来返回结果,这就是一致性读的本质含义。
当前读
为了提高事务处理的速度,
oracle
采用了读一致性机制。就是当一个会话更新数据后未提交时,其它会话读取到更新前的结果。这大大提高数据并发的效率,但某些特定条件下会产生错误的结果。
下面的例子进行说明。
假设存在表
test
(
A number(10,2)
)其中有一行记录,字段
A
的值为
100
表
test
时间点
|
Session1
|
Session2
|
T1
|
update test set A=(select A+1 from
test)
|
|
T2
|
commit
|
|
T3
|
|
update test set A=(select A+1 from
test)
|
T4
|
|
commit
|
当会话
1
提交后再执行会话
2
时,得到得结果是
102
时间点
|
Session1
|
Session2
|
T1
|
update test set A=(select A+1 from
test)
|
|
T2
|
|
update test set A=(select A+1 from
test)
|
T3
|
commit
|
|
T4
|
|
commit
|
当会话
1
执行后未提交,会话
2
就已经执行,得到得结果是
101
,并不是
102
。这是因为
oracle
为了提供数据的并发访问速度,在一个会话更新数据后未提交时,另一个会话
select
到的将是第一个会话更新前的数据
单多个会话并发时,会产生不确定得结果,这不是我们想看到的。在并发系统开发时应多注意此类问题。
上面的两个会话可以改成以下做法,保证数据的准确更新
时间点
|
Session1
|
Session2
|
T1
|
update test set A=A+1
|
|
T2
|
|
update test set A=A+1
|
T3
|
commit
|
|
T4
|
|
commit
|
Oracle
的当前读会使
session2
看到
session1
做出的修改
更新丢失
例子
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
开始事务
|
T3
|
Update auction set status=’
卖出
’ where auction_id=1
|
|
T4
|
|
Update auction set status=’
卖出
’ where
auction_id=1
|
T5
|
commit
|
|
T6
|
|
commit
|
上例中,如果在业务逻辑上是在拍卖一个商品,那么同时这一个商品会被
session1
的用户与
session2
的用户同时拍到。
采用悲观锁或乐观锁可保证同一商品不会被两人同时拍到
悲观锁
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
开始事务
|
T3
|
Select * from auction where auction_id=1 for update
nowait
|
|
T4
|
Update auction set status=’
卖出
’ where auction_id=1
|
|
T5
|
|
Select * from auction where auction_id=1 for update
nowait
|
T6
|
|
Update auction set status=’
卖出
’ where
auction_id=1
|
T7
|
commit
|
|
T8
|
|
commit
|
Session2
在
T5
时刻发现有人锁定了要修改的行,则无法锁定成功,
update
操作将不会执行
乐观锁
时间点
|
Session1
|
Session2
|
T1
|
开始事务
|
|
T2
|
|
开始事务
|
T3
|
Update auction set status=’
卖出
’ where auction_id=1 and
status=’
未卖出
’
|
|
T4
|
|
Update auction set status=’
卖出
’ where auction_id=1 and
status=’
未卖出
’
|
T5
|
commit
|
|
T6
|
|
commit
|
Session2
在
T4
时刻由于当前读,
status=’
未卖出
’
的行已读不到,所以
session2
的用户没有更新到行。
分享到:
相关推荐
本文将基于给定文件的标题、描述、标签以及部分内容,深入探讨如何查询Oracle数据库的最大并发数,以及这一参数对系统性能的影响。 ### Oracle最大并发数查询 在企业级应用中,Oracle数据库因其强大的数据处理能力...
Veeam 备份恢复 Oracle 数据库详细配置文档 本文档旨在详细介绍如何使用 Veeam 备份恢复 Oracle 数据库的配置过程。该文档将指导读者从环境准备到推送 Oracle RMAN Plugin,再到创建备份作业和运行备份作业,最后...
【Oracle数据库大作业】是一个关于Oracle数据库在教务管理系统中的应用项目,可能涵盖了数据库设计、实施、优化等多个方面的内容。这个大作业包含了PPT演示文稿、Word文档以及可能的源代码,为学习者提供了全面了解...
在介绍ORACLE数据库并发访问控制机制及访问冲突的解决方法之前,首先需要了解ORACLE数据库的基础知识。作为全球知名的关系型数据库产品,ORACLE数据库具备出色的数据库管理能力、超强的稳定性和良好的并发控制机制,...
Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中占据主导地位。本指南将针对初学者,详细介绍Oracle数据库的基础知识、安装与配置,以及一些常用的操作和管理技巧。 **1. Oracle...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,适用于处理大量数据和并发事务。 Oracle数据库连接模块的核心在于如何建立和管理与Oracle服务器的通信。在这个模块中,通常会用到Oracle的数据访问接口,如...
Oracle数据库是业界广泛使用的大型关系型数据库管理系统,由Oracle公司开发。它支持大容量的数据库,高并发事务处理,提供了强大的数据安全性和完整性控制。Oracle数据库拥有成熟的架构设计,能够在多种操作系统平台...
1. **Oracle数据库体系结构**:Oracle数据库的核心架构包括数据存储、内存结构和进程结构三大部分。数据存储主要通过数据文件、控制文件、重做日志文件和归档日志文件来保存数据;内存结构主要包括系统全局区(SGA)...
45. 在ORACLE7数据库并发控制技术的研究及其应用 46. 在SQLPlus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了 47. 在客户端处理Oracle的数据行加锁问题 48. 怎样查看init_ora文件 49. ...
Oracle数据库以其稳定性、可扩展性和安全性著称,支持大规模并发事务处理,适合复杂的企业级应用。此外,Oracle还提供了一整套数据库解决方案,包括数据库服务器、开发工具、中间件和云服务。 “Oracle体系结构”是...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,它在企业级数据存储和管理中扮演着核心角色。Oracle数据库基础知识是每个IT从业者或自学者必备的知识领域。以下将深入讲解Oracle数据库的一些关键概念和操作...
《Oracle数据库性能优化实践指南》是一本专注于Oracle数据库性能调优的专业书籍,旨在帮助读者深入理解和掌握如何在实际环境中提升Oracle数据库的运行效率。Oracle数据库是全球广泛使用的大型企业级数据库管理系统,...
这些参数的合理配置,可以在很大程度上提升Oracle数据库的并发处理能力和资源利用效率,特别是在处理大量并发请求时表现更为显著。 #### 方案二:内存分配优化 在高负载环境下,合理分配和管理内存资源对于Oracle...
### Oracle数据库管理员技术指南:建立和配置数据库 在IT领域,尤其是数据库管理中,Oracle数据库因其卓越的性能和广泛的应用而备受青睐。对于希望成为Oracle数据库管理员(DBA)的专业人士而言,掌握创建和配置...
### Oracle数据库、表空间及数据文件之间的关系 在Oracle数据库管理系统的架构中,数据库、表空间与数据文件之间存在着紧密的联系。理解这些组件之间的相互作用对于有效地管理和维护Oracle数据库至关重要。 #### ...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它为数据存储、管理和处理提供了高效、安全和可扩展的解决方案。对于初学者来说,理解Oracle数据库系统应用与开发的基础至关重要,这将帮助他们掌握...
Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。Oracle数据库以其高效、稳定和强大的功能在企业级应用中占据主导地位,尤其在金融、电信、医疗等对...
Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。本详细课件将引导你逐步了解Oracle数据库的基础知识,为你的入门之旅提供全面指导。 1. **Oracle...