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


12

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?

Risposte:


17

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 dell'inizio dell'istruzione, ma dalla maggior parte degli esempi che ho visto provare a implementare questa logica, le persone vedono un'istruzione multi-riga come una serie di passaggi successivi e si aspettano che il istruzione [2] per vedere 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.


9

Una 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:


1
Almeno per me, cambiando per essere un trigger dopo fallisce su 11.2.0.4.0
Software Prophets

Anche per me; versione 12.1.0.2.0 e AFTER non funziona.
eidylon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.