如何导致" ORA-01555:快照太旧错误"没有更新

时间:2015-11-12 04:33:40

标签: oracle jdbc transactions

我遇到了ORA-01555:Oracle 9i的快照太旧错误,但根本没有使用此应用程序运行任何更新。

错误发生在应用程序连接几个小时后没有任何查询,然后每个查询(否则将是亚秒级查询)返回ORA-01555:快照太旧:回滚段号6,名称为&# 34; _SYSSMU6 $"太小了。

这可能是事务隔离设置为TRANSACTION_SERIALIZABLE的原因吗?或者JDBC代码中的其他一些错误?这可能是由jdbc-go driver中的一个错误造成的,但是我读到的有关此错误的所有信息都让我相信没有DML语句的情况会发生这种情况。

2 个答案:

答案 0 :(得分:2)

请阅读以下Tom Kyte对此错误的深入见解。在您的情况下,问题可能来自所谓的' 延迟块清除'。这是选择创建重做的情况。但是,根本原因几乎可以确定回滚段的大小不正确(但Tom添加为相关原因:提交太频繁,许多更新后读取太大等)。

snaphot too old error (Tom Kyte)

答案 1 :(得分:0)

当您在Oracle数据库上运行查询时,结果将是Oracle所称的"读取一致性快照"。

这意味着结果中的所有数据项都将使用截至查询开始时的值表示。

为实现此目的,DBMS会查看回滚段以获取自查询开始以来已更新的项的原始值。

DBMS以循环方式使用回滚段并最终回绕 - 覆盖旧数据。

如果您的查询需要回滚段中不再提供的数据,您将获得"快照太旧"。

如果您的查询在同时更新的数据上运行了很长时间,就会发生这种情况。

您可以通过扩展回滚段或避免与重度更新程序同时运行查询来阻止它。

我还相信,与Oracle 9i的情况相比,较新版本的Oracle提供了更好的回滚段动态管理。