java Oracle序列事务性
我需要在一个特定的业务场景中,在一个实体(而不是PK)上设置一个序列中的数字(序列必须是一个介于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
”,同时在另一个事务中调用相同的方法(并行请求),那么确定序列返回的值不同吗
无法从第一个事务读取未提交的值吗
因为假设我没有使用sequence和一个简单的表,在其中我会增加自己的序列,那么事务2将能够读取相同的值,如果TrasCatinality是默认的“read COMMITTED”
# 1 楼答案
Oracle保证序列号会有所不同。即使事务被回滚,序列也会被“使用”,而不会重新发布到另一个查询
编辑:在Cris的评论中陈述了关于“无差距”的要求后添加额外信息
如果您的需求是一个没有间隙的数字序列,那么oracle序列可能不是一个合适的解决方案,因为在事务回滚、数据库重新启动或任何其他情况下都会有间隙
序列主要是作为唯一数字(例如主键)的高性能生成工具,不考虑间隙和事务上下文约束
如果您的设计/业务/审计需求需要考虑每个数字,那么您将需要设计一个在事务上下文中使用预定数字的解决方案。在多线程环境中,这可能很棘手,并且容易出现性能/锁定问题。最好尝试重新定义你的需求,这样差距就无关紧要了