首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle顺序事务性

问Oracle顺序事务性
EN

Stack Overflow用户
提问于 2012-08-24 14:45:17
回答 4查看 15.4K关注 0票数 17

我需要一个特定的业务场景来设置一个实体(而不是主键)上的一个字段,一个序列中的一个数字(该序列必须是一个介于min和max之间的数字

我这样定义了这个序列:

代码语言:javascript
复制
CREATE SEQUENCE MySequence
  MINVALUE 65536 
  MAXVALUE 4294967296 
  START WITH 65536
  INCREMENT BY 1
  CYCLE
  NOCACHE
  ORDER;

在Java代码中,我像这样从序列中检索数字:

代码语言:javascript
复制
select mySequence.nextval from dual

我的问题是:

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

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

因为假设我不会使用序列和一个普通的表,在这个表中我会递增序列,那么如果trasactinalitY是默认的"READ COMMITTED“,那么事务2将能够读取相同的值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-24 15:03:57

答案是否定的。

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

序列与事务无关。

请参阅here the docs

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

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

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

票数 40
EN

Stack Overflow用户

发布于 2012-08-24 14:57:14

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

编辑:在Cris的评论中说明了“无间隙”的要求之后,添加了额外的信息

如果您的需求是一个没有间隙的数字序列,那么oracle序列可能不是一个合适的解决方案,因为在事务回滚、数据库重新启动或任何其他情况下都会有间隙。

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

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

票数 7
EN

Stack Overflow用户

发布于 2012-08-24 14:56:54

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12104407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档