Sql 如何找到序列的最后一个数字

Sql 如何找到序列的最后一个数字,sql,spring-batch,sequences,Sql,Spring Batch,Sequences,我在应用程序中使用spring批处理。我有一个上传过程,其中数据从excel文件加载到DB中。excel有五个电子表格加载到五个不同的表中。如果上传成功,则没有问题。但是当上传失败时,比如在第3页,我会回滚整个上传。这会导致第一个表中的序列跳过数字。我怎样才能解决这个问题。我的序列递增1,没有缓存 提前感谢要解决此问题,您很可能需要改变您的期望。序列在事务中使用时通常不会回滚。例如: T1使用序列S插入表A以生成PK值 T2使用序列S插入表B以生成PK值 现在您回滚T1。T2中的PKs值会发生什

我在应用程序中使用spring批处理。我有一个上传过程,其中数据从excel文件加载到DB中。excel有五个电子表格加载到五个不同的表中。如果上传成功,则没有问题。但是当上传失败时,比如在第3页,我会回滚整个上传。这会导致第一个表中的序列跳过数字。我怎样才能解决这个问题。我的序列递增1,没有缓存


提前感谢

要解决此问题,您很可能需要改变您的期望。序列在事务中使用时通常不会回滚。例如:

  • T1使用序列S插入表A以生成PK值
  • T2使用序列S插入表B以生成PK值
  • 现在您回滚T1。T2中的PKs值会发生什么变化?它们应该重新编号吗?如果有人(比如Java程序)已经读取了PK值怎么办

    您可以看到,即使对于非常简单的情况,也不可能回滚序列

    有些数据库有
    identity
    列的概念,DB服务器在这些列中内部分配密钥,但即使是这些,也会有间隙


    如果您确实需要不间断的PK流,则必须使用您自己的序列(或Java代码中的计数器),并自行维护/重置此序列。

    我们在这里讨论的是Oracle序列吗?谢谢Aaron。我对每个表使用单独的序列。在这种情况下,首先回滚T2,然后只回滚T1。顺便说一句,我已经编写了一个java代码,在上传失败时重置序列。当两个进程同时将数据插入同一个表时,同样的问题也会发生。