如何获取JSP和Oracle中Web会话的最后插入序列值?

时间:2015-04-01 16:27:07

标签: oracle jsp

首先,我请求您,请不要将此视为重复。 我已经看到了这个问题的所有主题,但没有一个是我的类型 我正在使用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。 提前谢谢。

1 个答案:

答案 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>