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