【发布时间】:2012-08-19 17:21:24
【问题描述】:
我需要针对特定的业务场景在实体(不是 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”,同时在另一个事务中调用相同的方法(并行请求),那么确定序列返回的值不同吗?
不可能从第一个事务中读取未提交的值吗?
因为假设我不会使用序列和一个普通表,我会在其中增加序列,那么如果 trasactinalitY 是默认的“READ COMMITTED”,那么事务 2 将能够读取相同的值。
【问题讨论】:
-
为什么没有缓存和订单?这对性能没有好处。
-
由于业务限制,导致需要使用序列中的每个数字。如果使用缓存并且数据库服务器停止运行,甚至 1 分钟都停止了,我知道缓存的序列号会丢失。
-
即使没有缓存,你也会丢失数字。考虑获取序列和回滚。在这种情况下,你确实有差距。
-
嗯,有这种情况,用于恢复丢失的号码,并且会有一些,因为回滚不是很频繁。使用缓存可能会使差距更大。这是一个问题,如果? ...如果我们使用缓存,性能会提高...
标签: java sql oracle hibernate sequence-sql