- 浏览: 519313 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u011165335:
distinct不影响使用半连接
(转)关于semi-join/anti-join的一点探讨 -
353790060:
redo 记录事务执行后的日志 undo 记录事务回滚的日志 ...
Oracle redo与undo浅析 -
jayxigua:
redo用于在失败时重放事务(即恢复事务),undo则用于取消 ...
Oracle redo与undo浅析 -
aa_qq110:
Openbravo有中文包吗
Openbravo开发手册 -
iocaop:
不错,写的很清晰易懂
JAVA 服务提供者框架介绍
由于在校验和的乐观锁定方法中,计算散列或校验和是一个CPU密集型操作(相当占用CPU),其计算代价很昂贵。不过,如果从“网络友好性”角度看,这种方法会比较好,因为只需在网络上传输相当小的散列值。而使用ORA_ROWSCN的乐观锁定也拥有它的优点,同时计算时不是CPU密集的(不会过多占用CPU)。所以就不介绍检验和的乐观锁定方法了!
从Oracle 10g Release 1开始,你还可以使用内置的ORA_ROWSCN函数。它的工作与前面所述的版本列技术很相似,但是可以由Oracle自动执行,而不需要在表中增加额外的列,也不需要额外的更新/维护代码来更新这个值。
ORA_ROWSCN建立在内部Oracle系统时钟(SCN)基础上。在Oracle中,每次提交时,SCN都会推进(其他情况也可能导致SCN推进,要注意,SCN只会推进,绝对不会后退)。这个概念与前面在获取数据时得到ORA_ROWSCN的方法是一样的,更新数据时要验证SCN未修改过。之所以我会强调这一点(而不是草草带过),原因是除非你创建表时支持在行级维护ORA_ROWSCN,否则Oracle会在块级维护。也就是说,默认情况下,一个块上的多行会共享相同的ORA_ROWSCN值。如果更新一个块上的某一行,而且这个块上还有另外50行,那么这些行的ORA_ROWSCN也会推进。这往往会导致许多假警报,你认为某一行已经修改,但实际上它并没有改动。因此,需要注意这一点,并了解如何改变这种行为。
我们想查看这种行为,然后进行修改,为此还要使用前面的小表DEPT:
create table dept
2 (deptno, dname, loc, data,
3 constraint dept_pk primary key(deptno)
4 )
5 as
6 select deptno, dname, loc, rpad('*',3500,'*')
7 from scott.dept;
Table created.
现在可以观察到每一行分别在哪个块上(在这种情况下,可以假设它们都在同一个文件中,所以如果块号相同,就说明它们在同一个块上)。我使用的块大小是8 KB,一行的宽度大约3 550字节,所以我预料这个例子中每块上有两行:
select deptno, dname,
2 dbms_rowid.rowid_block_number(rowid) blockno,
3 ora_rowscn
4 from dept;
DEPTNO DNAME BLOCKNO ORA_ROWSCN
---------- -------------- ---------- ----------
10 ACCOUNTING 20972 34676029
20 RESEARCH 20972 34676029
30 SALES 20973 34676029
40 OPERATIONS 20973 34676029
不错,我们观察的结果也是这样,每块有两行。所以,下面来更新块20972上DEPTNO = 10的那一行:
update dept
2 set dname = lower(dname)
3 where deptno = 10;
1 row updated.
commit;
Commit complete.
接下来观察到,ORA_ROWSCN的结果在块级维护。我们只修改了一行,也只提交了这一行的修改,但是块20972上两行的ORA_ROWSCN值都推进了:
select deptno, dname,
2 dbms_rowid.rowid_block_number(rowid) blockno,
3 ora_rowscn
4 from dept;
DEPTNO DNAME BLOCKNO ORA_ROWSCN
---------- -------------- ---------- ----------
10 accounting 20972 34676046
20 RESEARCH 20972 34676046
30 SALES 20973 34676029
40 OPERATIONS 20973 34676029
如果有人读取DEPTNO=20这一行,看起来这一行已经修改了,但实际上并非如此。块20973上的行是“安全”的,我们没有修改这些行,所以它们没有推进。不过,如果更新其中任何一行,两行都将推进。所以现在的问题是:如何修改这种默认行为。遗憾的是,我们必须启用ROWDEPENDENCIES再重新创建这个段。
Oracle9i为数据库增加了行依赖性跟踪,可以支持推进复制,以便更好地并行传播修改。在Oracle 10g之前,这个特性只能在复制环境中使用;但是从Oracle 10g开始,还可以利用这个特性用ORA_ROWSCN来实现一种有效的乐观锁定技术。它会为每行增加6字节的开销(所以与自己增加版本列的方法(即DIY版本列方法)相比,并不会节省空间),而实际上,也正是因为这个原因,所以需要重新创建表,而不只是简单地ALTER TABLE:必须修改物理块结构来适应这个特性。
下面重新建立我们的表,启用ROWDEPENDENCIES。可以使用DBMS_REDEFINITION中(Oracle提供的另一个包)的在线重建功能来执行,但是对于一个这么小的任务,我们还是从头开始更好一些:
drop table dept;
Table dropped.
create table dept
2 (deptno, dname, loc, data,
3 constraint dept_pk primary key(deptno)
4 )
5 ROWDEPENDENCIES
6 as
7 select deptno, dname, loc, rpad('*',3500,'*')
8 from scott.dept;
Table created.
select deptno, dname,
2 dbms_rowid.rowid_block_number(rowid) blockno,
3 ora_rowscn
4 from dept;
DEPTNO DNAME BLOCKNO ORA_ROWSCN
---------- -------------- ---------- ----------
10 ACCOUNTING 21020 34676364
20 RESEARCH 21020 34676364
30 SALES 21021 34676364
40 OPERATIONS 21021 34676364
又回到前面:两个块上有4行,它们都有相同的ORA_ROWSCN值。现在,更新DEPTNO=10的那一行时:
update dept
2 set dname = lower(dname)
3 where deptno = 10;
1 row updated.
commit;
Commit complete.
查询DEPT表时应该能观察到以下结果:
select deptno, dname,
2 dbms_rowid.rowid_block_number(rowid) blockno,
3 ora_rowscn
4 from dept;
DEPTNO DNAME BLOCKNO ORA_ROWSCN
---------- -------------- ---------- ----------
10 accounting 21020 34676381
20 RESEARCH 21020 34676364
30 SALES 21021 34676364
40 OPERATIONS 21021 34676364
此时,只有DEPTNO = 10这一行的ORA_ROWSCN改变,这正是我们所希望的。现在可以依靠ORA_ROWSCN来为我们检测行级修改了。
发表评论
-
Oracle事务原理探究2--读书笔记五
2015-01-05 13:46 1706续上篇... 3. 数据块访问与undo ... -
Oracle事务原理探究1--oracle核心技术读书笔记五
2014-12-29 21:18 20291. 冲突解决 假如有一个系统只有你和我两个 ... -
oracle undo 复杂度--oracle核心技术读书笔记四
2014-10-01 14:23 1290一. 概述 undo ... -
Oracle redo 复杂度--oracle核心技术读书笔记三
2014-09-29 22:13 1190一. 概述 我 ... -
(转)undo系列学习之Oracle IMU及Redo Private Strands技术
2014-09-27 23:09 1170原博客地址: http://blo ... -
oracle如何保证事务的ACID原则--oracle核心技术读书笔记二
2014-09-21 11:18 1787在事务中有四个通用的原则是所有数据库都必须遵守的,简称ACI ... -
Oracle基本数据改变原理浅析(redo与undo)--oracle核心技术读书笔记一
2014-09-14 17:00 4847在oracle中我们做一些更新操作,oracle底层是怎么流 ... -
(转)Oracle中Hint深入理解
2014-01-07 19:48 1217原文出处:http://czmmiao.iteye.com/ ... -
Oracle全表扫描成本示例
2013-12-29 22:51 0一. 准备工作 1. block size 8KB( ... -
(转)Oracle查看trace文件步骤
2013-12-10 09:54 5451原文地址: http://www.2cto.com/data ... -
【转】CBO hint:no_unnest,push_subq,push_pred的用法
2013-12-02 20:11 1269原博客地址:http://blog.itpub.net/15 ... -
index_stats视图各列的含义
2013-12-02 19:10 1404index_stats视图来收集B树 ... -
(转)Oracle 调整SGA、PGA大小
2013-10-31 13:25 31219SQL> show parameter sga; ... -
(转)Oracle cursor_sharing 参数 详解
2013-08-25 23:04 1997原博客地址:http://blog.csdn.net/tia ... -
(转)shared pool 原理
2013-08-18 22:58 1492原博客地址:http://blog.csdn.net/ro ... -
(转)Oracle 游标(cursor)说明
2013-08-15 20:17 1495原博客地址:http://blog.csdn.net/ti ... -
(转)关于semi-join/anti-join的一点探讨
2013-08-14 21:20 11015原博客地址:http://space.itpub.net ... -
oracle 索引访问方式
2013-07-29 23:02 1468一. 概述 index uni ... -
(转)Oracle动态性能视图学习笔记(2)_v$sesstat_v$mystat_v$statname
2013-07-29 21:41 1215原博客地址:http://space.itpub.net/1 ... -
(转)Oracle性能优化 之 共享池
2013-07-29 21:04 1270转载作品,原始出去如下: http://blog.ch ...
相关推荐
通过使用ORA_ROWSCN伪列,我们可以高效地进行数据迁移,并且可以保证数据库的完整性和一致性。 在本文中,我们将详细介绍ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究,并讨论其优缺点。同时,我们还将讨论其他...
1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ROWSCN伪列是Oracle 10g开始引入的,可以查询表中记录最后变更的SCN。然后通过SCN_TO_TIMESTAMP函数可以将SCN转换为时间戳,从而找到最后DML操作时SCN的对应时间。...
Oracle 10g引入了一项新特性,即`ORA_ROWSCN`伪列,这是一个非常有用的工具,尤其对于数据仓库的维护和跟踪数据变化。在传统的数据库管理中,要跟踪行的变化,通常需要在表中添加一个“最后更新时间”列,并在每次...
标题“ora_convert_mysql.tar.gz”表明这是一个用于转换Oracle数据库数据的工具,以便它们可以在MySQL数据库中使用的压缩包。描述提到,这是一个由个人编写的shell脚本,它能够生成在MySQL中执行的INSERT语句,这...
http://blog.csdn.net/bjchangxiao/article/details/68489880
本压缩包"ora_dbbak.rar_oracle"包含了与Oracle RMAN加密备份和恢复相关的脚本文件"ora_dbbak.sh",这将帮助我们了解如何安全地管理和保护Oracle数据库的数据。 首先,我们要理解RMAN的基本用法。RMAN通过与数据库...
"ora_错误代码"是我们讨论的重点,这代表了Oracle数据库在运行时遇到的问题。 Oracle错误代码是由"ORA-"开头的一串数字组成,比如"ORA-00001"、"ORA-01422"等。每一个这样的代码都对应着一个特定的错误信息,帮助...
ora_migrator为插件使用迁移Oracle数据库到PostgreSQL。 请阅读db_migrator文档以获取用法说明。 本自述文件仅涵盖插件的安装和设置以及常规文档中未涉及的其他功能。 除此之外, ora_migrator还提供了从Oracle到...
inceptor_ora_template_f2_append.sql
关于ORA_12514错误的详细解决办法
《Ora_10G_DBA_Reference》是一个关于Oracle 10g数据库管理的重要参考资料,主要面向DBAs(数据库管理员)和技术人员,旨在提供全面、深入的Oracle 10g数据库管理和维护知识。该资源包含两个文件:一本CHM格式的手册...
`ora_error大全.doc`文件显然包含了Oracle数据库所有可能的错误编号及其解释,这对于数据库管理员和开发人员来说是非常有价值的参考资源。 错误代码如ORA-12001到ORA-12053,代表了Oracle数据库在执行操作时遇到的...
navicat112_ora_en_x64.exe
ora_单行函数.sql
ora_orad.sql
navicat091_ora_cs for oracle 开发工具racle 数据库管理工具,它可以将 DBF, CSV, XML 和其他普遍的数据格式加入到 Oracle 数据库中,消除了耗时的数据输入和与之相伴的错误。除此之外,它还包括导入、导出向导、...
根据提供的文件信息,我们深入探讨“sap_ora_adm”这一主题,即SAP系统与Oracle数据库的管理。 ### SAP与Oracle的整合 #### 1. **SAP NetWeaver 04** SAP NetWeaver是SAP公司推出的一系列集成技术平台之一,旨在...
linux 下 shell 连接 oracle 数据库...脚本产生的背景是生产服务器每天产生几万笔数据,使用的数据库是oralceXE,当数据文件超过4G,会提示错误ORA-12953。因此需要调整数据库中部分表,日志表,部分数据,或者数据文件
一款简单的ORM,简单易用,开发成本极低,该orm支持.net_4.0以上版本,支持多数据库,Ora_SimpleOrm