ITPub博客

首页 > 数据库 > Oracle > ORA_ROWSCN与按照commit时间对记录进行排序

ORA_ROWSCN与按照commit时间对记录进行排序

原创 Oracle 作者:zhang41082 时间:2019-06-03 15:06:04 0 删除 编辑

问题的提出:
在并发的环境下,每个sql先执行的不一定先提交,因此想如何才能按照事务提交的顺序来对记录进行排序而不是按照sql执行的时间。

[@more@]


先来说说sysdate或者systimestamp,如果系统中使用这样的列来记录每个记录最后提交的时间,那是错误的。而且很多人认为这个时间如果设置为default值,那么记录的就是sql执行的时间,其实也是错误的。oracle 10.2 版本的concept第388页有这样一句话“Default values are included as part of an INSERT statement before the statement is parsed.”因此可以看到,把列的default值设置为缺省值,或者insert into table(col1...) values (sysdate,...)的方式最后得到的时间都是sql解析的时间而不是sql执行的时间。
ORA_ROWSCN是oracle 10G版本中提出的概念,是一个伪列,用来记录数据提交时候的scn,而scn是唯一的,而且scn的先后就是commit的时间的先后(虽然事务commit不是导致scn增长的唯一因素)。因此可以按照这个伪列进行排序,得到的结果就是事务提交的先后进行的排序。
默认的建表方式的ORA_ROWSCN记录的scn是精确到每个block而不是精确到block中的每个row的,因为ORA_ROWSCN取自data block header的scn。要使用此特性需要使用以下方式建表:create table tab(col1 number) rowdependencies。这样就可以为每个列保存自己的scn,需要增加每行数据6个字节的空间的开销。
另外,oracle还提供了ORA_ROWSCN到TIMESTAMP的转换,可以得到每个记录最后的修改时间,但这个时间和真正的数据发生变化的时间有误差,误差在正负3秒(引用自TOM,是否是因为每3秒SCN会刷一次有关呢?有待验证

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25016/viewspace-921602/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 遭遇ITL死锁
请登录后发表评论 登录
全部评论

注册时间:2002-10-11

  • 博文量
    105
  • 访问量
    80923