使用Oracle SCN跟踪已修改的行

时间:2017-12-31 16:00:38

标签: oracle

我可以依靠Oracle SCN来跟踪数据库中已修改的行吗?目标是每x分钟查询一次在特定表中已修改的所有行的数据库。我们的想法是使用

记住当前的SCN
SELECT current_scn FROM V$DATABASE;

然后在x分钟后我会运行像

这样的查询
SELECT * from mytable where ORA_ROWSCN > current_scn_x_minutes_ago;

获取自那时以来已更改的所有行(因此具有更高的SCN)。我知道查询将返回太多结果,因为每个块管理SCN但这没关系。我的主要问题是SCN是否严格增加,即下一个生成的SCN是否总是高于当前SCN(从V $ DATABASE查询),或者我是否必须依赖SCN_TO_TIMESTAMP函数来确保排序是正确的。

1 个答案:

答案 0 :(得分:3)

  

我的主要问题是SCN是否严格增加,   即,下一个生成的SCN是否总是高于当前   SCN

根据文件:ORA_ROWSCN Pseudocolumn

  

无论是在块级别还是在行级别,ORA_ROWSCN都应该   不被认为是精确的SCN。例如,如果是交易   更改了一个块中的行R并在SCN 10中提交,但并非总是如此   确实,该行的ORA_ROWSCN将返回10.而值为   永远不会返回少于10,任何大于或等于的值   可以返回10。也就是说,行的ORA_ROWSCN不是   始终保证是事务的确切提交SCN   最后修改了那一行。 但是,使用细粒度的ORA_ROWSCN,如果是两个   事务T1和T2一个接一个地修改了同一行R,并且   已提交,在提交T1后对行R的ORA_ROWSCN进行查询   将返回一个低于提交后返回的值的值   T2 即可。

     

如果一个块被查询两次,那么它的值可能是   ORA_ROWSCN在查询之间进行更改,即使行没有   在查询之间的时间内更新。 唯一的保证是   两个查询中ORA_ROWSCN的值都大于   提交最后修改该行的事务的SCN。