Perché DBMS_MVIEW.REFRESH ha un commit implicito?
-
06-07-2019 - |
Domanda
Di recente ho notato che chiamare dbms_mview.refresh (...), che aggiorna le viste materializzate in Oracle, ha un impegno implicito.
Qualunque idea diversa da " perché fa " - perché questa azione ha un impegno implicito?
Soluzione
A seconda della versione di Oracle e / o dei parametri forniti, dbms_mview.refresh potrebbe eseguire un TRUNCATE seguito da un carico diretto. TRUNCATE è un comando DDL e pertanto emette un commit implicito. Il caricamento diretto non richiede un commit.
Se stai usando una versione più recente di Oracle, penso 10.2+, puoi impostare il parametro atomic_refresh su TRUE e si aggiorna all'interno di una singola transazione, usando DELETE / INSERT standard. Questo metodo potrebbe essere un po 'più lento però.
Altri suggerimenti
Secondo Tom Kyte è perché in fase di progettazione è stata presa la decisione di considerare l'aggiornamento come un'operazione DDL . Dal momento che tutte le operazioni DDL commettono implicitamente, così fa anche questa. Sfortunatamente non risponde alla domanda che ne risulta sul perché scelgono di farlo DDL.
Una soluzione è quella di eseguire la chiamata a dbms_mview.refresh in una transazione autonoma (creare una procedura PL / SQL con pragma autonomous_transaction).