`
liwenshui322
  • 浏览: 519313 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用ORA_ROWSCN的乐观锁定

阅读更多

      由于在校验和的乐观锁定方法中,计算散列或校验和是一个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来为我们检测行级修改了。

 

分享到:
评论

相关推荐

    ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究.pdf

    通过使用ORA_ROWSCN伪列,我们可以高效地进行数据迁移,并且可以保证数据库的完整性和一致性。 在本文中,我们将详细介绍ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究,并讨论其优缺点。同时,我们还将讨论其他...

    ORACLE中查找定位表最后DML操作的时间小结

    1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始引入的,可以查询表中记录最后变更的SCN。然后通过SCN_TO_TIMESTAMP函数可以将SCN转换为时间戳,从而找到最后DML操作时SCN的对应时间。...

    用Oracle 10g新的行时间戳捕捉变化

    Oracle 10g引入了一项新特性,即`ORA_ROWSCN`伪列,这是一个非常有用的工具,尤其对于数据仓库的维护和跟踪数据变化。在传统的数据库管理中,要跟踪行的变化,通常需要在表中添加一个“最后更新时间”列,并在每次...

    ora_convert_mysql.tar.gz

    标题“ora_convert_mysql.tar.gz”表明这是一个用于转换Oracle数据库数据的工具,以便它们可以在MySQL数据库中使用的压缩包。描述提到,这是一个由个人编写的shell脚本,它能够生成在MySQL中执行的INSERT语句,这...

    orcl_ora_2035.trc

    http://blog.csdn.net/bjchangxiao/article/details/68489880

    ora_dbbak.rar_oracle

    本压缩包"ora_dbbak.rar_oracle"包含了与Oracle RMAN加密备份和恢复相关的脚本文件"ora_dbbak.sh",这将帮助我们了解如何安全地管理和保护Oracle数据库的数据。 首先,我们要理解RMAN的基本用法。RMAN通过与数据库...

    ora_错误代码

    "ora_错误代码"是我们讨论的重点,这代表了Oracle数据库在运行时遇到的问题。 Oracle错误代码是由"ORA-"开头的一串数字组成,比如"ORA-00001"、"ORA-01422"等。每一个这样的代码都对应着一个特定的错误信息,帮助...

    ora_migrator:从Oracle到PostgreSQL迁移的工具

    ora_migrator为插件使用迁移Oracle数据库到PostgreSQL。 请阅读db_migrator文档以获取用法说明。 本自述文件仅涵盖插件的安装和设置以及常规文档中未涉及的其他功能。 除此之外, ora_migrator还提供了从Oracle到...

    inceptor_ora_template_f2_append.sql

    inceptor_ora_template_f2_append.sql

    ORA_12514错误解决方法

    关于ORA_12514错误的详细解决办法

    Ora_10G_DBA_Reference

    《Ora_10G_DBA_Reference》是一个关于Oracle 10g数据库管理的重要参考资料,主要面向DBAs(数据库管理员)和技术人员,旨在提供全面、深入的Oracle 10g数据库管理和维护知识。该资源包含两个文件:一本CHM格式的手册...

    ora_error大全.doc

    `ora_error大全.doc`文件显然包含了Oracle数据库所有可能的错误编号及其解释,这对于数据库管理员和开发人员来说是非常有价值的参考资源。 错误代码如ORA-12001到ORA-12053,代表了Oracle数据库在执行操作时遇到的...

    navicat112_ora_en_x64.exe

    navicat112_ora_en_x64.exe

    ora_单行函数.sql

    ora_单行函数.sql

    ora_orad.sql

    ora_orad.sql

    navicat091_ora_cs

    navicat091_ora_cs for oracle 开发工具racle 数据库管理工具,它可以将 DBF, CSV, XML 和其他普遍的数据格式加入到 Oracle 数据库中,消除了耗时的数据输入和与之相伴的错误。除此之外,它还包括导入、导出向导、...

    sap_ora_adm

    根据提供的文件信息,我们深入探讨“sap_ora_adm”这一主题,即SAP系统与Oracle数据库的管理。 ### SAP与Oracle的整合 #### 1. **SAP NetWeaver 04** SAP NetWeaver是SAP公司推出的一系列集成技术平台之一,旨在...

    ora_trunc_table.sh

    linux 下 shell 连接 oracle 数据库...脚本产生的背景是生产服务器每天产生几万笔数据,使用的数据库是oralceXE,当数据文件超过4G,会提示错误ORA-12953。因此需要调整数据库中部分表,日志表,部分数据,或者数据文件

    一款简单的ORM,简单易用,开发成本极低,该orm支持.net_4.0以上版本,支持多数据库,Ora_SimpleOrm.zip

    一款简单的ORM,简单易用,开发成本极低,该orm支持.net_4.0以上版本,支持多数据库,Ora_SimpleOrm

Global site tag (gtag.js) - Google Analytics