Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java sql序列id(双重的nextval)回滚_Java_Oracle - Fatal编程技术网

Java sql序列id(双重的nextval)回滚

Java sql序列id(双重的nextval)回滚,java,oracle,Java,Oracle,我创建了一个自动创建id的序列,并指定它从一个特定的数字开始,比如100 创建序列SEQ\u I\u LOVE\u SQL以100递增1开始 在我的Java逻辑中,下面的sql语句被调用 从dual中选择I_LOVE_SQL.nextval 这意味着创建id 101。假设逻辑发生了变化,需要从101回滚到100。在我的Java逻辑中,什么样的sql语句可以实现这一点?如果确实需要回滚序列号的生成,则必须使用计数器表而不是序列。但您应该记住,您正在这个计数器上序列化事务,这两个计数器不能并行运行。

我创建了一个自动创建id的序列,并指定它从一个特定的数字开始,比如100

创建序列SEQ\u I\u LOVE\u SQL以100递增1开始

在我的Java逻辑中,下面的sql语句被调用

从dual中选择I_LOVE_SQL.nextval


这意味着创建id 101。假设逻辑发生了变化,需要从101回滚到100。在我的Java逻辑中,什么样的sql语句可以实现这一点?

如果确实需要回滚序列号的生成,则必须使用计数器表而不是序列。但您应该记住,您正在这个计数器上序列化事务,这两个计数器不能并行运行。因此,首先,您应该检查这是否真的是一个严格的要求,而不仅仅是希望id分配是事务性的,因为每个实现都会带来性能损失(我可以想到的一个用例是发票号,在某些立法中要求发票号是无间隙的)。一旦确定需要重新播放,请使用计数器值维护一个表,并尽可能晚地获取ID,以保持争用窗口较小

每当您认为需要更改序列的下一个值时,您可能是在做一些不明智的事情。一旦获取序列的下一个值,就无法回滚。您必须删除并重新创建序列才能实现这一点。一般来说,在实践中,您确实无法维护无间隙ID序列,也不需要这样做。如果我将列的最大值和+1设置为该值,这是否足够安全?@bouncingHippo仅当您处于单用户环境中时。如果我将列的最大值和+1设置为该值,该怎么办,这足够安全吗