甲骨文序列事务性

2022-09-02 19:20:27

我需要一个特定的业务场景来设置一个实体(不是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 COMMITED”,则事务2将能够读取相同的值。


答案 1

答案是否定的。

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

序列与事务无关。

请参阅此处的文档

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

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

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


答案 2

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

编辑:在Cris的评论中陈述了围绕“无间隙”的要求之后添加其他信息

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

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

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


推荐