我们已经知道oracle多版本机制能够提供一致性的答案,而且还有高度的并发性。但是真的就没有其他不好的一面吗?

案例1:

假设有一个资源调度程序(可以用来调度会议室,投影仪等资源),业务规则是:在给定的时间段不能将一种资源分配给多人。这里涉及到资源表(Resources)与资源调度表(Secludes)。

我们一般的实现方式是,先查询某一时间段的某一资源是否已经被分配,如果没有被分配,我们就可以使用。

查看是否被分配SQL语句:

select count(*)  from schedules where resource_name = :room_name

and (start_time <= :new_end_time)  and (end_time >= :new_start_time)。  —SQL1

然后插入分配记录(如果得到结果为0)  www.2cto.com

insert into schedules ( resource_name, start_time, end_time )

values  ( p_resource_name, p_start_time, p_end_time );   —SQL2

但是如果我们让2个人同时预定13:00到14:00期间的投影仪资源,可能都会预定成功。假设一个人是事务A,另外一个人是事务B,在事务A执行SQL1语句的时候,事务B也开始执行SQL1语句(因为oracle里面查询是不会被阻塞的)。那么事务A与事务B查询的结果都是0,于是都可以申请到投影仪资源了。

解决方案:

应该在查询之前先锁定要申请的资源,使得事务A与事务B在执行SQL1与SQL2语句的时候串行。

在执行SQL1语句之前先执行如下SQL语句:

select * from resources where resource_name = :room_name FOR UPDATE;  —SQL3

这样当事务A执行完SQL3之后,事务B执行SQL3的时候就会被阻塞。除非事务B申请资源跟事务A不同。

案例2:热表上超出期望的I/O

在生产环境中在一个大负载条件下,一个查询使用的 I/O 比你在测试或开发系统时观察到的 I/O 要多得多。造成这种现象的原因是:在你测试系统中,由于它是独立的,所以不必撤销事务修改。不过,在生产系统中,读一个给定的块时,可能必须撤销(回滚)多个事务所做的修改,而且每个回滚都可能涉及I/O来获取undo信息并应用于系统。

因为oracle提供多版本机制的原理是,读取数据的时候判断这个数据是不是已经被修改了,如果被修改了就从undo段去获取修改前的数据。如果发现这个修改前的数据还不是想要的数据,继续找更老的数据,直到找到开始执行SQL语句那一刻这个数据的值。

所以在oracle里面如果一个表经常被修改,查询,会发生这样的情况。因为查询的时候,如果被修改的数据越多,需要读取undo段的信息就越长,I/O操作自然也会越多。对于这种热表的查询,最好能够把查询的时间压缩到最短,以便在查询期间,这个数据被其他事务修改的概率最低,从而需要从undo段读取的数据最少,最大限度减少I/O操作的概率。

作者 liwenshui322

oracle 多版本机制,关于oracle多版本机制副作用的问题-Oracle相关推荐

  1. 数据3分钟丨Oracle宣布从JDK17开始提供免费版本和更新​;ClickHouse 宣布独立成立公司...

    数据 3 分钟 由 ACDU (中国 DBA 联盟) 与墨天轮联合出品的全新视频节目上线啦-三分钟带你来了解数据行业动态,节目内容主要包含数据行业最新的产品发布.公司大事件.行业新闻等. 本期内容概览 ...

  2. Oracle 加快 Java 迭代速度,功能性版本只维护六个月

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 本文经授权转自开源中国 2018 年,Java 将发生重要改变.正如之前所报道的,它正在转向 ...

  3. oracle 11g dul,【学习笔记】Oracle DUL 11 兼容Oracle 12C数据库的DUL工具最新版本

    天萃荷净 oracle dul 11 正式发布,迫不及待的下载来测试,现在版本号为dul 11.2.0.0.1,目前只发布了for linux,其他版本估计要等等.期待该版本有引进新功能 1.orac ...

  4. 适配Oracle版本的ojbc驱动包版本,以及ojdbc驱动包的下载地址

    1.适配Oracle版本的ojbc驱动包版本 2. ojdbc驱动包的下载地址 ojdbc各个版本下载 3.将ojdbc放在一个c盘根目录下,然后以管理员身份打开cmd,执行下面命令:(做这一一步之前 ...

  5. OGG 有for Oracle database 10g and Linux Itanium CPU 版本的介质

    OGG 有for Oracle database 10g and Linux Itanium CPU 版本的介质.该ogg的版本号是11.2.1.0.2,该文件的文件名是V34011-01.zip

  6. oracle补丁版本查看的sql,Oracle、SQLServer、ArcSDE怎么查看版本、补丁 - ArcGIS技巧研讨 - 博客频道nbsp...

    在我们安装ArcSDE时都会首先要查看体系需求,只有这样,传奇土城花补丁,才干保证我们的服务器环境运行比拟稳固,以下是先容在应用不同数据库中怎么查看相应的安装版本,以及相干的安装补丁. Oracle ...

  7. Oracle RAC (11.2.0.4版本) For AIX 6.1安装手册

    [部分引用别人的文档修改而成,实际经过安装验证的文档] Oracle Rac 11GR2(11.2.0.4) For AIX6.1+ASM安装手册 部分截图采用了网上别人的图片以及部分章节 2 安装环 ...

  8. oracle 12c 低版本,oracle高版本迁移数据到低版本(12c至11g)方法

    1.12c版本信息: 2.11g版本信息: 3.查看12c的字符集编码: select userenv('language') from dual; 要迁移的两个数据库字符集编码要保持一致.如果不一致 ...

  9. oracle怎么将一列挪到另一列,详细讲解Oracle数据库的数据迁移方法

    <详细讲解Oracle数据库的数据迁移方法>由会员分享,可在线阅读,更多相关<详细讲解Oracle数据库的数据迁移方法(4页珍藏版)>请在人人文库网上搜索. 1.详细讲解 Or ...

  10. 《Oracle达人修炼秘籍:Oracle 11g数据库管理与开发指南 》一3.6 卸载Oracle 11g产品...

    3.6 卸载Oracle 11g产品 如果Oracle数据库服务器出现故障无法恢复,或由于某些特殊原因需要卸载数据库服务器产品,可以按下面的步骤完全卸载数据库服务器产品. 1)停止所有Oracle相关 ...

最新文章

  1. react控制 input 框回车之后内容清空
  2. 只服这篇“神文”:基于老子哲学、相对论的超级人工智能模型
  3. 使用XML模板在excel进行配置
  4. 防火墙x86架构和ASIC架构和NP架构的区别
  5. Pair Project: Elevator Scheduler Report By Hu Renjun
  6. 【原创】Quartz代码详解
  7. 【文件系统】删除文件名中含有空格的文件
  8. 剖析CWE视图的层次定义和解析方式
  9. 服务器增加驱动器,向存储空间直通添加服务器或驱动器
  10. 冲刺七天----03
  11. [bzoj5301][Cqoi2018]异或序列
  12. tablelayout高度问题
  13. c++ 时间类型详解(time_t和tm)
  14. WiFi接口(1)——模块适配(AW-CM358)
  15. Office Excel 插入电子签名 实现多人电子签名可追溯
  16. Congestion 问题怎么解决?
  17. C/C++ fabs 函数 - C语言零基础入门教程
  18. 超详细mac新手教程,让你离熟练操作mac只需十分钟!
  19. 如何使用sql语句算两经纬度的距离
  20. 【数据结构与算法】学习笔记-《算法笔记》-7

热门文章

  1. Codeforces903E Swapping Characters
  2. SecurityManager篇
  3. 图片呈现jQuery中fadeIn、fadeOut、fadeTo的用法(图片隐藏与显示)
  4. 关于XP下OpenGL的配置
  5. Character,String相关方法,Int,double互相转换
  6. STL不是线程安全的啊
  7. python把cookie分割成字典
  8. 7、扫雷游戏地雷数计算
  9. Vue的50个知识点
  10. java 获取自绘窗口_iPhone中自绘实现步骤