it-swarm.it

Quali sono le cause e le soluzioni per gli errori delle tabelle mutanti?

Comprendo che gli errori di tabella mutanti sono causati da un difetto di progettazione o da una query problematica.

Recentemente è stata messa in produzione una vecchia query che genera un errore di tabella mutante. Il nostro DBA ha risolto il problema ma non sappiamo come.

Cosa causa esattamente gli errori delle tabelle mutanti e come il nostro DBA avrebbe risolto il problema?

12
parmanand

La causa più probabile di un errore di tabella mutante è l'uso improprio dei trigger. Ecco un tipico esempio:

  1. si inserisce una riga nella tabella A
  2. un trigger sulla tabella A (per ogni riga) esegue una query sulla tabella A, ad esempio per calcolare una colonna di riepilogo
  3. Oracle lancia un ORA-04091: la tabella A sta mutando, il trigger/funzione potrebbe non vederlo

Questo è un comportamento normale e previsto, Oracle vuole proteggerti da te stesso poiché Oracle garantisce:

  • (i) che ogni affermazione è atomica (cioè fallirà o avrà successo completamente)
  • (ii) che ogni affermazione vede una visione coerente dei dati

Molto probabilmente quando scrivi questo tipo di trigger ti aspetteresti che la query (2) veda la riga inserita su (1). Ciò sarebbe in contraddizione con entrambi i punti precedenti poiché l'aggiornamento non è ancora terminato (potrebbero essere inserite più righe).

Oracle potrebbe restituire il risultato coerente con un punto nel tempo appena prima il all'inizio dell'istruzione ma dalla maggior parte degli esempi che ho visto tentare di implementare questa logica, le persone vedono un'istruzione multi-riga come una serie di passaggi successivi e si aspettano che l'istruzione [2] veda le modifiche apportate dai passaggi precedenti. Oracle non può restituire il risultato previsto e pertanto genera l'errore.

Per ulteriori letture: "tabella mutante" su Ask Tom .

Se, come sospetto, la causa dell'errore della tabella mutante è un trigger, un modo per evitare l'errore è spostare la logica dal trigger nelle procedure.

17
Vincent Malgrat

Un tabella mutante si verifica quando un'istruzione provoca l'attivazione di un trigger e tale trigger fa riferimento alla tabella che ha causato il trigger. Il modo migliore per evitare tali problemi è di non utilizzare i trigger, ma sospetto che il DBA non abbia impiegato il tempo per farlo. Avrebbe potuto effettuare una delle seguenti operazioni:

9
Leigh Riffel