oracle 多版本机制,关于oracle多版本机制副作用的问题-Oracle
我们已经知道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相关推荐
- 数据3分钟丨Oracle宣布从JDK17开始提供免费版本和更新;ClickHouse 宣布独立成立公司...
数据 3 分钟 由 ACDU (中国 DBA 联盟) 与墨天轮联合出品的全新视频节目上线啦-三分钟带你来了解数据行业动态,节目内容主要包含数据行业最新的产品发布.公司大事件.行业新闻等. 本期内容概览 ...
- Oracle 加快 Java 迭代速度,功能性版本只维护六个月
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 本文经授权转自开源中国 2018 年,Java 将发生重要改变.正如之前所报道的,它正在转向 ...
- oracle 11g dul,【学习笔记】Oracle DUL 11 兼容Oracle 12C数据库的DUL工具最新版本
天萃荷净 oracle dul 11 正式发布,迫不及待的下载来测试,现在版本号为dul 11.2.0.0.1,目前只发布了for linux,其他版本估计要等等.期待该版本有引进新功能 1.orac ...
- 适配Oracle版本的ojbc驱动包版本,以及ojdbc驱动包的下载地址
1.适配Oracle版本的ojbc驱动包版本 2. ojdbc驱动包的下载地址 ojdbc各个版本下载 3.将ojdbc放在一个c盘根目录下,然后以管理员身份打开cmd,执行下面命令:(做这一一步之前 ...
- 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
- oracle补丁版本查看的sql,Oracle、SQLServer、ArcSDE怎么查看版本、补丁 - ArcGIS技巧研讨 - 博客频道nbsp...
在我们安装ArcSDE时都会首先要查看体系需求,只有这样,传奇土城花补丁,才干保证我们的服务器环境运行比拟稳固,以下是先容在应用不同数据库中怎么查看相应的安装版本,以及相干的安装补丁. Oracle ...
- Oracle RAC (11.2.0.4版本) For AIX 6.1安装手册
[部分引用别人的文档修改而成,实际经过安装验证的文档] Oracle Rac 11GR2(11.2.0.4) For AIX6.1+ASM安装手册 部分截图采用了网上别人的图片以及部分章节 2 安装环 ...
- oracle 12c 低版本,oracle高版本迁移数据到低版本(12c至11g)方法
1.12c版本信息: 2.11g版本信息: 3.查看12c的字符集编码: select userenv('language') from dual; 要迁移的两个数据库字符集编码要保持一致.如果不一致 ...
- oracle怎么将一列挪到另一列,详细讲解Oracle数据库的数据迁移方法
<详细讲解Oracle数据库的数据迁移方法>由会员分享,可在线阅读,更多相关<详细讲解Oracle数据库的数据迁移方法(4页珍藏版)>请在人人文库网上搜索. 1.详细讲解 Or ...
- 《Oracle达人修炼秘籍:Oracle 11g数据库管理与开发指南 》一3.6 卸载Oracle 11g产品...
3.6 卸载Oracle 11g产品 如果Oracle数据库服务器出现故障无法恢复,或由于某些特殊原因需要卸载数据库服务器产品,可以按下面的步骤完全卸载数据库服务器产品. 1)停止所有Oracle相关 ...
最新文章
- react控制 input 框回车之后内容清空
- 只服这篇“神文”:基于老子哲学、相对论的超级人工智能模型
- 使用XML模板在excel进行配置
- 防火墙x86架构和ASIC架构和NP架构的区别
- Pair Project: Elevator Scheduler Report By Hu Renjun
- 【原创】Quartz代码详解
- 【文件系统】删除文件名中含有空格的文件
- 剖析CWE视图的层次定义和解析方式
- 服务器增加驱动器,向存储空间直通添加服务器或驱动器
- 冲刺七天----03
- [bzoj5301][Cqoi2018]异或序列
- tablelayout高度问题
- c++ 时间类型详解(time_t和tm)
- WiFi接口(1)——模块适配(AW-CM358)
- Office Excel 插入电子签名 实现多人电子签名可追溯
- Congestion 问题怎么解决?
- C/C++ fabs 函数 - C语言零基础入门教程
- 超详细mac新手教程,让你离熟练操作mac只需十分钟!
- 如何使用sql语句算两经纬度的距离
- 【数据结构与算法】学习笔记-《算法笔记》-7