Oracle序列事务性

我需要一个特定的业务场景,在一个实体(而不是PK)上设置一个序列中的数字(序列必须是最小值和最大值之间的数字)

我定义了这样的序列:

CREATE SEQUENCE MySequence MINVALUE 65536 MAXVALUE 4294967296 START WITH 65536 INCREMENT BY 1 CYCLE NOCACHE ORDER; 

在Java代码中,我从序列中检索数字,如下所示:

 select mySequence.nextval from dual 

我的问题是:

如果我在一个事务中称之为“ select mySequence.nextval from dual ”并且在另一个事务中同时调用相同的方法(并行请求),那么它确定序列返回的值是否不同?

是不是可以从第一个事务中读取未提交的值?

因为让我说我不会使用序列和一个普通表,我会增加自己的序列,然后如果trasactinalitY是默认的“READ COMMITTED”,事务2将能够读取相同的值。

答案是不。

Oracle保证序列生成的数字不同。 即使发出并行请求,RAC环境或回滚和提交也是混合的。

序列与事务无关。

在这里看到文档 :

使用CREATE SEQUENCE语句创建一个序列,该序列是一个数据库对象,多个用户可以从中生成唯一的整数。 您可以使用序列自动生成主键值。

生成序列号时,序列会递增,与事务提交或回滚无关 。 如果两个用户同时递增相同的序列,则每个用户获取的序列号可能有间隙,因为序列号是由另一个用户生成的。 一个用户永远不能获取另一个用户生成的序列号。 在由一个用户生成序列值之后,该用户可以继续访问该值,而不管该序列是否由另一个用户递增。

序列号是独立于表生成的,因此相同的序列可用于一个或多个表。 单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。 另外,单个用户可能没有意识到其他用户正在从相同的序列中绘制。

Oracle保证序列号不同。 即使您的事务被回滚,序列也会被“使用”,而不会重新发布给另一个查询。

编辑:在Cris的评论中陈述“无差距”的要求之后添加其他信息

如果您的要求是针对一系列没有间隙的数字那么oracle序列可能不是一个合适的解决方案,因为当事务回滚时,或者数据库重新启动或任何其他数量的方案时会有间隙。

序列主要用作唯一编号(例如主键)的高性能生成工具,而不考虑间隙和事务上下文约束。

如果您的设计/业务/审计要求需要考虑每个数字,那么您需要设计一个在事务上下文中使用预定数字的解决方案。 这可能很棘手,并且在multithreading环境中容易出现性能/锁定问题。 最好尝试重新定义您的要求,以便差距无关紧要。

sequence.nextval永远不会为并发请求返回相同的值(在循环之前)。 也许您应该检查以下URL:

http://docs.oracle.com/cd/B19306_01/server.102/b14220/schema.htm#sthref883

不幸的是,你必须实现你’自己的轮’ – 交易顺序。 它非常简单 – 只需创建表格,如sequence_name varchar2,value,min_value number,max_value number,need_cycle char,并将’select value into sequence from变量等待表中的变量等待(或nowait – 它取决于您的场景)’。 在它发出update set value = variable from previous step + 1之后,其中sequence_name =序列的名称,并从客户端发出commit语句。 而已。