Sequência do Oracle nextval está pulando o número para frente e para trás

Eu criei uma nova tabela e uma nova seqüência, eu tenho dois serviços web C # tentando inserir registros para esta tabela usando a mesma consulta utilizando mySequence.nextval (e sim eu verifiquei muitas vezes, ambos usam mySequence.nextval ).

Os dois serviços da Web estão inserindo linhas na tabela, mas o mySequence.nextval está retornando números fora de sequência

Aqui está como os registros foram criados, mostrando PrimaryKey que obtém seu valor de mySequence.nextval

1 21 22 23 2 3 24 25 4 27 28 5

Até agora não há duplicatas, mas por que é mySequence.nextval pulando para frente e para trás? e devo me preocupar com isso

Atualização: A sequência é criada com cache_size = 20

Eu aposto que seu database está executando o RAC (Real Application Clusters). Supondo que seja o caso e que você crie a sequência com todas as configurações padrão, esse é o comportamento esperado.

A configuração padrão é armazenar em cache 20 valores. Cada nó no cluster RAC, por padrão, terá um cache separado. Supondo que você tenha um cluster com dois nós A e B, a primeira vez que um nextval for solicitado em A, A armazenará em cache os valores de 1 a 20 e retornará um valor de 1. Se a próxima solicitação para um nextval for feita em B, B armazenará em cache os valores de 21 a 40 e retornará um valor de 21. A partir daí, o valor obtido dependerá do nó em que sua conexão está sendo executada.

Geralmente, isso não deve ser um problema. Sequências geram números únicos. Os números geralmente não precisam ser consecutivos. Se você realmente precisa que os valores sejam retornados sequencialmente porque você está fazendo algo como ordenar pelo valor gerado por sequência para determinar a “primeira” ou a “última” linha, você pode usar a cláusula ORDER ao criar a sequência para forçar valores a serem retornou em ordem. Isso tem uma implicação de desempenho negativo em um database RAC, no entanto, porque aumenta a quantidade de comunicação que precisa continuar entre os nós para sincronizar os valores que estão sendo retornados. Se você precisar determinar a “primeira” ou “última” linha, geralmente é melhor adicionar uma date ou uma coluna de timestamp date e timestamp à tabela e ordená-la, em vez de assumir que a chave primária é gerada sequencialmente.

Dos docs …

Os números de sequência são gerados independentemente das tabelas, portanto, a mesma sequência pode ser usada para uma ou várias tabelas. É possível que números de sequência individuais pareçam ser ignorados, porque foram gerados e usados ​​em uma transação que acabou sendo revertida. Além disso, um único usuário pode não perceber que outros usuários estão desenhando na mesma seqüência.

http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314