Oracle SEQUENCE的事务性(Oracle Sequence Transactionali

2019-06-27 08:03发布

我需要一个特定的业务场景设置在一个实体(不是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的交易,并在另一个事务同样的方法在同一时间”被称为(并行请求),可以肯定的是由序列返回的值是不同的?

不可能有像读取第一个事务未提交的价值?

原因让我们说我有没有使用序列和一个普通的表在那里我会增加自己的序列,那么交易2本来能够读取相同的值,如果trasactinalitY是默认的“READ COMMITTED”。

Answer 1:

答案是不。

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

序列已无关的交易。

见这里的文档 :

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

当产生一个序列号,该序列被递增, 独立提交或回滚事务的。 如果两个用户同时增加相同的序列,则序列号的每个用户获取可具有间隙,因为正在由其他用户产生的序列号。 一个用户可以从未获取由其他用户产生的序列号。 中的序列值是由一个用户产生之后,该用户可以继续不管序列是否由另一个用户递增访问该值。

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



Answer 2:

甲骨文保证序列号会有所不同。 即使你的事务回滚,是“拿来主义”的序列,而不是重新给其他查询。

编辑:围绕“无缝隙”的要求后,添加额外的信息,意见由克里斯入账

如果你的要求是数字的无间隙序列那么Oracle序列可能不会是一个合适的解决方案,将有差距时,交易回滚,或重新启动数据库或任何其他数量的场景时。

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

如果您的设计/商业/审计要求,需要考虑每一个数字,那么你就需要而不是设计一个使用的事务上下文中的预定数量的解决方案。 这可能会非常棘手且易发生性能/在多线程环境中锁定问题。 这将是更好地尝试重新定义您的要求,这样的差距并不重要。



Answer 3:

sequence.nextval从未返回并发请求相同的值(前循环)。 也许你应该检查以下网址:

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



Answer 4:

不幸的是你要实现你自己的轮子' - 事务序列。 这是相当简单 - 只需创建像SEQUENCE_NAME VARCHAR2,价值,MIN_VALUE号,MAX_VALUE号,need_cycle char和周围乱表“选择值成变量从更新等待您的序列表(或NOWAIT - 这取决于从您的方案)”。 之后,它的问题更新设定值=变量将上一步骤+ 1,其中SEQUENCE_NAME =您的序列名称,并发出从客户端提交的语句。 而已。



文章来源: Oracle Sequence Transactionality