Oracle序列 - 我们可以回滚一个序列吗?

3

我正在使用Oracle 11g。在创建序列时,我遇到了一个问题。

是否可以使用Java回滚一个序列?

如果可以的话,请给我建议。


你为什么想要这样做? - Frank Schmitt
请查看@Guntram答案下的我的评论。 - Santhosh
除非你能确定一个实际的问题,否则不要试图寻找解决方案。 - David Aldridge
1
@sankrish Sequence旨在始终生成下一个可能的值。它只能从开头重新启动。无法“回滚”生成的序列,因为另一个进程中的并行会话可能已经增加了它。序列是无状态的。它们被生成后就不知道是否有用。因此,对于您的情况,您可能需要编写自己的逻辑。但要使其“线程安全”几乎是不可能的。 - Maheswaran Ravisankar
@OracleUser,感谢您清晰的解释。 - Santhosh
1个回答

5

是的,请使用alter sequence。请参阅http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_2011.htm

但请注意,这没有真正的用途。除非您删除使用序列的表中的所有记录,否则在使用序列创建唯一ID时会出现错误。

而且,您生成的数字将始终存在“空洞”,试图使由序列创建的ID连续是没有意义的。想象一下用户A进行插入,用户B进行另一个插入,用户B提交,用户A回滚。A使用的序列号将丢失,因为B使用了更高的序列号。


在我的情况下,我有5个使用相同序列的插入语句。即使其中一个以错误结束,我也想回滚序列。 - Santhosh
5
如果另一个用户执行相同的代码,创建了另外5个序列号,然后第一个用户出现错误会发生什么?不要试图创建连续的ID,这不会奏效。你需要唯一的ID,序列可以保证这一点,但是没有必要确保每个单独的ID都被使用。 - Guntram Blohm
1
@sankrish 问题仍然存在 - 在这种情况下,为什么需要回滚序列?序列非常适合生成唯一标识符,但不适合生成没有“空洞”的连续数字。 - Frank Schmitt
我只是想重复使用为部分执行生成的序列.. (即)如果插入了3个表的值,而2个失败了。 - Santhosh
我承认我没有检查语法,但我记得在某个地方看到过它被完成了。但是你是对的Jeffrey,它是按照你解释的方式完成的。谢谢你澄清这一点。 - Guntram Blohm
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接