c# - Oracle Sequence nextval 是来回跳数

标签 c# sql database oracle sequence

我创建了一个新表和一个新序列,我有两个 C# Web 服务试图使用使用 mySequence.nextval 的相同查询将记录插入到这个表中(是的,我检查了很多次,他们两者都使用 mySequence.nextval)。

这两个 Web 服务正在向表中插入行,但是 mySequence.nextval 返回的数字顺序乱序

下面是记录的创建方式,显示 PrimaryKeymySequence.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 数据库有负面的性能影响,因为它增加了节点之间需要进行的通信量以同步返回的值。如果您需要确定“第一行”或“最后一行”,通常最好将 datetimestamp 列添加到表中并以此排序,而不是假设主键是顺序生成的。

关于c# - Oracle Sequence nextval 是来回跳数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24440832/

相关文章:

c# - 字符串和静态字段是否被垃圾收集?

c# - 如何在 ApplyChanges 返回 false 时从 EditorPart 设置错误消息?

mysql - 在同一 SQL 查询中使用多个 CASE ... WHEN 语句时会发生什么?

mysql - 从表的列中查找最大值

c# - 如何禁用 Expect :100-Continue when using WCF in Windows Store App

c# - 递归快速排序遇到 StackOverflowException

sql - 在 wamp 中运行 8mb 的 sql 代码?

android - 如何从服务器更新数据库

PHP从多个表中获取数据

mysql - 使用 MySQL 加速多表连接