首先,我请求您,请不要将此视为重复。 我已经看到了这个问题的所有主题,但没有一个是我的类型 我正在使用JBOSS 6和Oracle 11g开发在线注册系统。我想按顺序给每个注册人一个独特的表格编号 为此,我认为oracle的主键字段的 sequence_name.nextval 最适合插入一个唯一但序列号,并且为了检索相同的值,我会使用 sequence_name.currval 。直到我希望,这没关系 但是,如果两个或多个并发用户同时提交Web表单,这是否会确保平价? (我的意思是并发用户之间会有重叠的价值交换吗?) 更确切地说,它是否依赖于会话?
让我给出两个假设的情况,以便事情变得更清楚。
假设有两个用户,user1和user2分别在Newyork和Paris分别尝试注册。在单击提交按钮之前,max(form_no)为100。现在,在我写的代码中说
insert into member(....) values(seq_form_no.nextval,....).
既然两个用户将调用位于两个不同终端的相同查询,他们将获得自己的顺序ID,或者user1将获得user2,反之亦然?希望我明白这个问题。看,序列将是唯一的,我知道,但我想分别关联插入的ID。 提前谢谢。
答案 0 :(得分:1)
我不太明白。但简单地说,SENQUENCE
确保并发事务/连接中生成的数字的唯一性。除非序列是使用CYCLE
选项创建的,否则在事务中,您可以依赖严格单调递增(递减)编号。但不是因为没有差距(可能是你在谈论“连续数字”时所期待的)。
值得一提的是序列号从不向后。当某人获取某个值时,它会从序列中“消耗”,并且永远不会返回到内部(CYCLE
旁边) - 即使您回滚当前事务。
来自the doc(强调我的):
生成序列号时,序列会递增,与事务提交或回滚无关。如果两个用户同时递增相同的序列,则每个用户获取的序列号可能有间隙,因为序列号是由另一个用户生成的。 一个用户永远无法获取其他用户生成的序列号。在一个用户生成序列值后,该用户可以继续访问该值,无论该序列是否由另一个用户递增。 / p>
我的JSP有点......“生锈”,但之类的会按预期工作:
<sql:update dataSource="${ds}" var="result">
INSERT INTO member(....) values(seq_form_no.nextval,....);
</sql:update>
<sql:query dataSource="${ds}" var="last_inserted_member_id">
SELECT seq_form_no.currval FROM DUAL;
</sql:query>