我可以依靠Oracle SCN来跟踪数据库中已修改的行吗?目标是每x分钟查询一次在特定表中已修改的所有行的数据库。我们的想法是使用
记住当前的SCNSELECT 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函数来确保排序是正确的。
答案 0 :(得分:3)
我的主要问题是SCN是否严格增加, 即,下一个生成的SCN是否总是高于当前 SCN
无论是在块级别还是在行级别,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。