Domanda

In questo momento il processo che stiamo usando per l'inserimento di insiemi di record è qualcosa di simile:

(e notare che "set di record" significa qualcosa come il record di una persona con i loro indirizzi, numeri di telefono, o qualsiasi altro tabelle unite).

  1. avviare una transazione.
  2. Inserisci un insieme di record che sono correlati.
  3. Commit se tutto fosse successo, ripristinare altrimenti.
  4. Torna al punto 1 per la prossima serie di record.

dovremmo fare qualcosa di più simile a questo?

  1. avviare una transazione all'inizio dello script
  2. Inizia un punto di salvataggio per ogni set di record.
  3. Inserire una serie di record correlati.
  4. Rullo di nuovo al punto di salvataggio, se c'è un errore, andare avanti se tutto va a buon fine.
  5. commit della transazione all'inizio dello script.

Dopo avere alcuni problemi con ORA-01555 e la lettura di alcuni articoli Chiedi Tom (come questo ), sto pensando di provare il secondo processo. Naturalmente, come sottolinea Tom, a partire da una nuova transazione è qualcosa che dovrebbe essere definita da esigenze aziendali. È il secondo processo la pena di provare, o è una cattiva idea?

È stato utile?

Soluzione

Una transazione dovrebbe essere un'unità significativa di lavoro. Ma ciò che costituisce un'unità di lavoro dipende dal contesto. In un sistema OLTP un'unità di lavoro sarebbe una sola persona, insieme con le loro informazioni di indirizzo, ecc ma suona come se si sta implementando una qualche forma di elaborazione batch, che sta caricando un sacco di persone.

Se si hanno problemi con l'ORA-1555 è quasi certamente perché si sono hanno una query in esecuzione lungo la fornitura di dati che è in fase di aggiornamento da altre transazioni. Commettere all'interno del vostro ciclo contribuisce all'uso ciclica dei segmenti Annulla e quindi tenderà ad aumentare la probabilità che i segmenti si fa affidamento su di fornire coerenza di lettura saranno stati riutilizzati. Quindi, non fare che è probabilmente una buona idea.

Sia utilizzando i punti di salvataggio è la soluzione è una questione diversa. Non sono sicuro di quale vantaggio che possa dare voi nella vostra situazione. Come si lavora con Oracle10g forse si dovrebbe considerare l'utilizzo di massa la registrazione degli errori DML .

In alternativa si potrebbe desiderare di riscrivere la query di guida in modo che funzioni con i più piccoli blocchi di dati. Senza sapere di più sulle specifiche del tuo processo non posso dare consigli specifici. Ma in generale, invece di aprire un cursore per 10000 record potrebbe essere meglio per aprirlo venti volte per 500 righe al pop. L'altra cosa da considerare è se il processo di inserimento può essere resa più efficiente, dire utilizzando raccolta massa e FORALL.

Altri suggerimenti

Alcuni pensieri ...

  1. Mi sembra uno dei punti del collegamento asktom era dimensioni il vostro rollback / undo in modo appropriato per evitare i 1555 di. C'è qualche motivo questo non è possibile? Come fa notare, è molto più conveniente per comprare su disco di quanto non lo è quello di scrivere / mantenere il codice per gestire muoversi limitazioni di rollback (anche se ho dovuto fare un Double-Take dopo aver letto il pricetag $ 250 per un drive 36GB - quel filo iniziato nel 2002 ! Buona illustrazione della legge di Moore!)
  2. Questo link (Burleson) mostra un possibile problema con i punti di salvataggio.
  3. è la transazione in realtà i punti 2,3, e 5 nel tuo secondo scenario? Se è così, questo è quello che mi piacerebbe fare - commetto ogni transazione. Suona un po 'a me come scenario 1 è un insieme di transazioni riuniti in un unico?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top