`
topcat
  • 浏览: 284669 次
  • 性别: Icon_minigender_1
  • 来自: 湖北武汉
社区版块
存档分类
最新评论

oracle数据库并发三

阅读更多

多版本模型与一致性读

一致性读

select 查询接触到一个被X 锁的块时,Oracle 绕开锁,并从回滚段中重构数据; 以实现数据的一致读。

Oracle 自动在查询上提供读一致性以使查询所能看到的数据均来自一个时间点上。

同样,ORACLE 也提供事务中所有查询的一致性,如你的update 就是一个事务。

Oracle 为保证一致性用回滚段来保存未提交或最近已提交的数据的旧值。

当查询进行的时候. 当前SCN 已被决定,因此, 每个查询返回所有截止于在查询执行点上的那个SCN 的所有提交的数据,在查询期间发生的其他事务改变不会被用到。

因此如果在查询前提交该事务. 那么数据是可见的。

读取操作只会读取读取查询开始时那一时刻的数据,如果数据在读取操作以后发生了变化,则从回滚段中读取old image

例子

假设表Acol1 的值初始为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

A

100

 

时间点

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最大并发数查询 在企业级应用中,Oracle数据库因其强大的数据处理能力...

    Veeam 备份恢复oracle数据库详细配置文档

    Veeam 备份恢复 Oracle 数据库详细配置文档 本文档旨在详细介绍如何使用 Veeam 备份恢复 Oracle 数据库的配置过程。该文档将指导读者从环境准备到推送 Oracle RMAN Plugin,再到创建备份作业和运行备份作业,最后...

    Oracle数据库大作业

    【Oracle数据库大作业】是一个关于Oracle数据库在教务管理系统中的应用项目,可能涵盖了数据库设计、实施、优化等多个方面的内容。这个大作业包含了PPT演示文稿、Word文档以及可能的源代码,为学习者提供了全面了解...

    ORACLE数据库并发访问控制机制及访问冲突的解决方法.pdf

    在介绍ORACLE数据库并发访问控制机制及访问冲突的解决方法之前,首先需要了解ORACLE数据库的基础知识。作为全球知名的关系型数据库产品,ORACLE数据库具备出色的数据库管理能力、超强的稳定性和良好的并发控制机制,...

    Oracle数据库使用指南

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中占据主导地位。本指南将针对初学者,详细介绍Oracle数据库的基础知识、安装与配置,以及一些常用的操作和管理技巧。 **1. Oracle...

    易语言oracle数据库连接模块源码

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,适用于处理大量数据和并发事务。 Oracle数据库连接模块的核心在于如何建立和管理与Oracle服务器的通信。在这个模块中,通常会用到Oracle的数据访问接口,如...

    Oracle数据库指南.pdf

    Oracle数据库是业界广泛使用的大型关系型数据库管理系统,由Oracle公司开发。它支持大容量的数据库,高并发事务处理,提供了强大的数据安全性和完整性控制。Oracle数据库拥有成熟的架构设计,能够在多种操作系统平台...

    oracle数据库简单介绍

    1. **Oracle数据库体系结构**:Oracle数据库的核心架构包括数据存储、内存结构和进程结构三大部分。数据存储主要通过数据文件、控制文件、重做日志文件和归档日志文件来保存数据;内存结构主要包括系统全局区(SGA)...

    Oracle数据库学习指南

    45. 在ORACLE7数据库并发控制技术的研究及其应用 46. 在SQLPlus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了 47. 在客户端处理Oracle的数据行加锁问题 48. 怎样查看init_ora文件 49. ...

    Oracle数据库应用课件

    Oracle数据库以其稳定性、可扩展性和安全性著称,支持大规模并发事务处理,适合复杂的企业级应用。此外,Oracle还提供了一整套数据库解决方案,包括数据库服务器、开发工具、中间件和云服务。 “Oracle体系结构”是...

    oracle数据库基础知识

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,它在企业级数据存储和管理中扮演着核心角色。Oracle数据库基础知识是每个IT从业者或自学者必备的知识领域。以下将深入讲解Oracle数据库的一些关键概念和操作...

    《Oracle数据库性能优化实践指南》PDF

    《Oracle数据库性能优化实践指南》是一本专注于Oracle数据库性能调优的专业书籍,旨在帮助读者深入理解和掌握如何在实际环境中提升Oracle数据库的运行效率。Oracle数据库是全球广泛使用的大型企业级数据库管理系统,...

    oracle数据库调优配置

    这些参数的合理配置,可以在很大程度上提升Oracle数据库的并发处理能力和资源利用效率,特别是在处理大量并发请求时表现更为显著。 #### 方案二:内存分配优化 在高负载环境下,合理分配和管理内存资源对于Oracle...

    Oracle数据库管理员技术指南,Oracle数据库管理员技术指南

    ### Oracle数据库管理员技术指南:建立和配置数据库 在IT领域,尤其是数据库管理中,Oracle数据库因其卓越的性能和广泛的应用而备受青睐。对于希望成为Oracle数据库管理员(DBA)的专业人士而言,掌握创建和配置...

    oracle数据库、表空间及数据文件之间的关系

    ### Oracle数据库、表空间及数据文件之间的关系 在Oracle数据库管理系统的架构中,数据库、表空间与数据文件之间存在着紧密的联系。理解这些组件之间的相互作用对于有效地管理和维护Oracle数据库至关重要。 #### ...

    oracle数据库系统应用与开发

    Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它为数据存储、管理和处理提供了高效、安全和可扩展的解决方案。对于初学者来说,理解Oracle数据库系统应用与开发的基础至关重要,这将帮助他们掌握...

    Oracle数据库 资料学习

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。Oracle数据库以其高效、稳定和强大的功能在企业级应用中占据主导地位,尤其在金融、电信、医疗等对...

    oracle数据库 详细课件

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。本详细课件将引导你逐步了解Oracle数据库的基础知识,为你的入门之旅提供全面指导。 1. **Oracle...

Global site tag (gtag.js) - Google Analytics