1

我正在使用 Spring 运行 Java 应用程序,但我的插入语句之一出现错误。我的错误是:

嵌套异常是 java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("MY_SCHEMA"."VALIDATION_RESULT"."RESULT_SEQ")

对于所有数据库人员,是否存在 Oracle 会nullnextval调用中返回的情况?如果多个线程同时调用它怎么办?

对于任何 Spring 开发人员,我们正在使用

org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer 

来处理序列。我们使用nextLongValue方法。

我的直觉告诉我,Oracle 没有给我 null nextval。从我已经搜索过的所有内容来看,这似乎是不可能的。任何人都可以确认吗?

4

1 回答 1

2

确认的。它们不返回 NULL。您收到一条错误消息。

Oracle 序列实际上会生成一个“nextval”对象块,因此线程可以快速访问它们。如果存在性能障碍,您可以更改序列以创建更大的预读值。唯一的可能是甲骨文严重损坏。让您的 DBA 查看警报日志。像 ORA-06nn 错误这样的错误是 DBA 的噩梦,并且是我所知道的唯一会破坏序列等对象的错误。在这种情况下,DB 和可能的 DBA 也接近 DOA。这种事情在职业生涯中会发生一次。

我会首先怀疑你的代码。或者有人修补序列——比如用 ALTER SEQUENCE 做一些愚蠢的事情。即,从一个重新开始序列并打破表约束。当您仅从数据库 DEV 导出表 -> 导入到数据库 TEST 时,也很容易按顺序搞砸事情,因为其他元数据也需要带过来。

于 2013-12-10T13:09:23.650 回答