Pergunta

Neste momento, o processo que estamos usando para inserir conjuntos de registros é algo como isto:

(e nota que "conjunto de registos" significa algo como registro de uma pessoa juntamente com os respectivos endereços, números de telefone ou quaisquer outras tabelas associadas).

  1. Inicie uma transação.
  2. Insira um conjunto de registros que estão relacionados.
  3. Commit se tudo foi bem sucedida, reverter o contrário.
  4. Volte para a etapa 1 para o próximo conjunto de registros.

deveríamos estar fazendo algo mais como este?

  1. Inicie uma transação no início do script
  2. Iniciar um Save Point para cada conjunto de registros.
  3. Insira um conjunto de registros relacionados.
  4. Roll volta para o ponto de salvamento, se houver um erro, vá em frente, se tudo for bem sucedido.
  5. Confirmar a transação no início do script.

Depois de ter alguns problemas com ORA-01555 e ler alguns artigos Ask Tom (como esta ), eu estou pensando em experimentar o segundo processo. Claro que, como Tom aponta, começando uma nova transação é algo que deve ser definido pelas necessidades do negócio. É a segunda pena processo de experimentar, ou é uma má idéia?

Foi útil?

Solução

A transação deve ser uma unidade significativa do trabalho. Mas o que constitui uma unidade de trabalho depende de contexto. Em um sistema OLTP uma unidade de trabalho seria uma única pessoa, juntamente com suas informações de endereço, etc. Mas soa como se você está implementando alguma forma de processamento em lote, que é lotes de carregamento das Pessoas.

Se você está tendo problemas com ORA-1555 é quase certamente porque você é ter uma consulta de longa duração fornecendo dados que está sendo atualizados por outras transações. Cometendo dentro de seus contribui de loop para o uso cíclico de segmentos undo, e por isso tende a aumentar a probabilidade de que os segmentos que estão contando com a fornecer consistência leitura terá sido reutilizada. Assim, não fazer isso é provavelmente uma boa idéia.

Seja usando pontos de salvamento é a solução é uma questão diferente. Eu não tenho certeza do que vantagem que lhe daria na sua situação. Como você está trabalhando com Oracle10g talvez você deve considerar o uso em massa erro DML registrando .

Como alternativa, você pode querer reescrever a consulta condução para que ele funcione com pequenos pedaços de dados. Sem saber mais sobre as especificidades do seu processo, não posso dar conselhos específicos. Mas, em geral, em vez de abrir um cursor para 10.000 registros pode ser melhor para abri-la vinte vezes para 500 linhas por pop. A outra coisa a considerar é se o processo de inserção pode ser mais eficiente, dizem usando coleta a granel e FORALL.

Outras dicas

Alguns pensamentos ...

  1. Parece-me que um dos pontos de ligação AskTom era tamanho o seu rollback / undo adequadamente para evitar os 1555 do. Existe alguma razão isso não é possível? Como ele aponta, é muito mais barato para comprar disco do que está a escrever / manter o código para lidar com ficando limitações em torno de reversão (embora eu tive que fazer um olhar duas vezes depois de ler o pricetag $ 250 para uma unidade de 36GB - esse segmento começou em 2002 ! Boa ilustração da Lei de Moore!)
  2. Este link (Burleson) mostra um possível problema com pontos de salvamento.
  3. É sua transação em passos atualidade 2,3, e 5 em seu segundo cenário? Se assim for, isso é o que eu faria - cometer cada transação. Soa um pouco para mim como cenário 1 é uma coleção de transações em um só?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top