我创建了一个新表和一个新序列,我有两个 C# Web 服务试图使用使用 mySequence.nextval
的相同查询将记录插入到这个表中(是的,我检查了很多次,他们两者都使用 mySequence.nextval
)。
这两个 Web 服务正在向表中插入行,但是 mySequence.nextval
返回的数字顺序乱序
下面是记录的创建方式,显示 PrimaryKey
从 mySequence.nextval
1 21 22 23 2 3 24 25 4 27 28 5
到目前为止没有重复但为什么 mySequence.nextval
来回跳转?我应该担心吗
更新: 使用 cache_size = 20 创建序列
最佳答案
我敢打赌您的数据库正在运行 RAC(真正的应用程序集群)。假设是这种情况,并且您使用所有默认设置创建序列,这就是预期的行为。
默认设置是缓存 20 个值。默认情况下,RAC 集群中的每个节点都有一个单独的缓存。假设您有一个包含两个节点 A 和 B 的集群,第一次在 A 上请求 nextval
时,A 将缓存值 1-20 并返回值 1。如果下一个请求nextval
在 B 上创建,B 将缓存值 21-40 并返回值 21。从那里,您获得的值将取决于您的连接恰好在其上运行的节点。
一般来说,这应该不是问题。序列生成唯一的数字。这些数字通常不需要连续。如果你真的需要按顺序返回值,因为你正在做一些事情,比如按序列生成的值排序以确定“第一”或“最后”行,你可以在创建时使用 ORDER
子句强制按顺序返回值的序列。然而,这对 RAC 数据库有负面的性能影响,因为它增加了节点之间需要进行的通信量以同步返回的值。如果您需要确定“第一行”或“最后一行”,通常最好将 date
或 timestamp
列添加到表中并以此排序,而不是假设主键是顺序生成的。
关于c# - Oracle Sequence nextval 是来回跳数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24440832/