Perché alcuni DBMS non consentono il rollback per determinate istruzioni DDL?


21

Recentemente ho scoperto che MySQL non supporta il rollback di DDL come "alter table" ... Essere abituato a PostgreSQL, che mi ha sembrato strano, ma un mio amico mi ha detto che anche Oracle non lo consente. Ci sono ragioni tecniche per non supportarlo? È semplicemente una caratteristica "poco interessante" per loro?

Modifica: ho appena trovato questo confronto . Sembra che ci sono molti DBMS che fanno sostegno DDL transazionale.


3
MySQL non consente DDL all'interno di una transazione. Prima di eseguire le istruzioni DDL, esegue il commit della transazione corrente (tutte le istruzioni DML correnti all'interno di questa transazione!) Senza alcun avviso.
Frank Heikens,

Esatto, abbastanza fastidioso IMO :)
Joril

Sono personalmente sorpreso dal fatto che Postgres lo permetta - puoi anche tornare indietro a DROPo a RENAME?
Joe,

1
Se non lasci cadere l'intero database, sì :) Vedi il link che ho appena aggiunto
Joril,

Quindi solo Oracle e MySQL non consentono le dichiarazioni DDL all'interno delle transazioni. Questa funzionalità consente di implementare facilmente schemi.
Marian,

Risposte:


19

Il motivo per cui questo funziona in PostgreSQL è che i cataloghi di sistema sono tabelle regolari. Pertanto, la creazione di una nuova funzione, ad esempio, richiede solo l'inserimento di una riga nella pg_proctabella, la modifica del valore predefinito di una colonna richiede solo l'aggiornamento di alcune righe pg_attrdefe così via. Dato che le tabelle sono comunque transazionali, dovresti quasi fare di tutto per non farlo funzionare in quel modo. (Molti dettagli di implementazione dolorosi sono stati omessi qui. ;-))

Suppongo, non conoscendo il codice sorgente, che altri motori di database utilizzino alcune strutture interne personalizzate per rappresentare le informazioni del loro catalogo di sistema. E quindi dovrebbero fare uno sforzo extra, probabilmente uno sforzo extra, per far funzionare il DDL transazionale, e apparentemente non è una priorità per loro.

Il rovescio della medaglia è che questo è il motivo per cui gli aggiornamenti delle versioni principali di PostgreSQL sono così dolorosi. Altri prodotti possono presumibilmente progettare le loro strutture di metadati interne tenendo conto delle modifiche e degli aggiornamenti, e quindi non ci sono problemi con l'aggiornamento a una nuova versione principale. In PostgreSQL, non c'è modo di cambiare una tabella del catalogo di sistema in modo che appaia improvvisamente come una versione più recente di una tabella del catalogo di sistema, almeno non mantenendo il sistema online, poiché ciò richiederebbe l'accesso ai cataloghi di sistema. Urgh.


1
Beh, preferirei che il mio DB fosse costantemente coerente rispetto alla facilità di aggiornamento della versione DB, ma credo sia una questione di opinione :) Grazie per la tua spiegazione!
Joril,

Questo può spiegare il problema per alcuni database, ma i cataloghi di sistema sono tabelle regolari su Oracle.
Leigh Riffel,

10

La maggior parte no? Bummer.

Uso principalmente SQL Server e lo fa. So che Oracle no, ma pensavo che Oracle potesse essere un'aberrazione.

In SQL Server, sono abbastanza certo che puoi eseguire più istruzioni DDL in una singola transazione anche se penso anche che ci siano un paio di restrizioni (che ho dimenticato tutte). Puoi fare una creazione o una modifica o una goccia della maggior parte delle cose e ripristinarla, se lo desideri. Red-Gate SQL Compare (uno strumento che adoro) ne approfitta.

Il problema è che l'ambito della transazione diventa abbastanza interessante ... Quando coinvolgi i cataloghi di sistema in una transazione di aggiornamento (DDL), corri il rischio di prendere alcuni blocchi davvero importanti e potresti bloccare l'accesso ai cataloghi di sistema. Gli utenti non possono fare molto se le loro query non riescono a trovare le loro tabelle nei cataloghi!

A conti fatti, tuttavia, è utile poter includere DDL in una transazione con più estratti conto.

Più utile, il comando DDL di SQL Server TRUNCATE può anche essere un elemento di una transazione con più istruzioni . Puoi troncare una tabella di destinazione (molto velocemente), crearla e quindi eseguire un commit se ti piace il risultato. Se qualcosa va storto, rollback e voilà !, è come se non avessi mai disturbato il tavolo. Anche lo spazio del registro è ridotto al minimo. Ne approfitto abbastanza spesso.


2
Ecco una risposta che mostra un esempio di DDL associato a transazione in SQL Server. Inoltre, ho sempre pensato TRUNCATEche non potesse essere ripristinato. Mi sbagliavo.
Nick Chammas,

5

In SQL Server possiamo eseguire il rollback delle istruzioni DDL, non utilizza il commit automatico alla fine dell'istruzione. In altri DBMS non lo so, ma ricordo che in Oracle non si può fare lo stesso. Credo che sia specifico per ogni DBMS, non sono sicuro di cosa direbbe lo standard SQL a riguardo, ma sono sicuro che nessun produttore implementa il 100% dello standard.

C'è una domanda simile su SO: è possibile eseguire più istruzioni DDL all'interno di una transazione (all'interno di SQL Server)?


5

Oracle ha condiviso l'analisi delle query, quindi un SELECT * FROM table_a eseguito da una sessione è (normalmente) uguale a quello di un'altra sessione. Ciò si spezzerebbe se una sessione pensasse che ci fossero dieci colonne nella tabella e un'altra pensasse che ce ne fossero undici.


Interessante dovresti dire che, l'altro giorno ho avuto un problema simile, l'applicazione doveva essere "hot" distribuibile, ma cambiando la struttura della tabella per la nuova versione, non aveva modo di ricompilare JDBC PreparedStatements oltre a riavviarlo , così tanto per quello!
Gaius,

2
A parte questo, la versione 11gR2 introduce il concetto di Edizioni per supportare gli aggiornamenti a caldo. Le connessioni effettivamente esistenti utilizzano un'edizione (con cinque colonne). Si avvia una nuova edizione, si aggiunge una colonna e si avvia alcune nuove connessioni utilizzando la nuova edizione per le nuove sessioni. Una volta terminate tutte le sessioni eccezionali, la vecchia edizione si avvia e tutto utilizza la nuova edizione. Nessun rollback, ma non aggiungi nuove attività alla tua nuova edizione fino a quando non funzionerà.
Gary,
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.