我需要一个特定的业务场景来设置一个实体(而不是主键)上的一个字段,一个序列中的一个数字(该序列必须是一个介于min和max之间的数字
我这样定义了这个序列:
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将能够读取相同的值。
发布于 2012-08-24 15:03:57
答案是否定的。
Oracle保证序列生成的数字是不同的。即使发出并行请求,RAC环境或回滚和提交也是混合的。
序列与事务无关。
使用CREATE sequence语句创建序列,序列是一个数据库对象,多个用户可以从中生成唯一的整数。您可以使用序列自动生成主键值。
当生成序列号时,该序列将递增,独立于事务提交或回滚的。如果两个用户同时递增相同的序列,则每个用户获取的序列号可能会有间隙,因为序列号是由另一个用户生成的。一个用户永远不能获得另一个用户生成的序列号。在一个用户生成序列值之后,该用户可以继续访问该值,而不管该序列是否由另一个用户递增。
序列号是独立于表生成的,因此相同的序列可以用于一个或多个表。单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。此外,单个用户可能没有意识到其他用户正在从相同的序列中进行绘制。
发布于 2012-08-24 14:57:14
Oracle保证序列号会有所不同。即使您的事务被回滚,序列也是“已使用”的,并且不会重新发出给另一个查询。
编辑:在Cris的评论中说明了“无间隙”的要求之后,添加了额外的信息
如果您的需求是一个没有间隙的数字序列,那么oracle序列可能不是一个合适的解决方案,因为在事务回滚、数据库重新启动或任何其他情况下都会有间隙。
序列主要用作唯一编号(例如主键)的高性能生成工具,而不考虑间隙和事务上下文约束。
如果您的设计/业务/审计需求需要考虑每个数字,那么您将需要设计一个在事务上下文中使用预定数字的解决方案。在多线程环境中,这可能很棘手,并且容易出现性能/锁定问题。最好试着重新定义你的需求,这样差距就不重要了。
发布于 2012-08-24 14:56:54
sequence.nextval从不为并发请求返回相同的值(在循环之前)。也许您应该检查以下URL:
http://docs.oracle.com/cd/B19306_01/server.102/b14220/schema.htm#sthref883
https://stackoverflow.com/questions/12104407
复制相似问题