È ansible eseguire più istruzioni DDL all’interno di una transazione (all’interno di SQL Server)?

Mi chiedo se è ansible eseguire più istruzioni DDL all’interno di una transazione. Sono particolarmente interessato a SQL Server, anche se potrebbero essere interessanti anche le risposte con altri database (Oracle, PostgreSQL).

Ho fatto alcuni “CREATE TABLE” e “CREATE VIEW” per la tabella creata all’interno di una transazione e sembra che ci siano alcune incoerenze e mi chiedo se i DDL non dovrebbero essere fatti all’interno della transazione …

Potrei probabilmente spostare il DDL al di fuori della transazione, ma mi piacerebbe avere qualche riferimento per questo. Quello che ho trovato fino ad ora:

  • I livelli di isolamento della pagina MSDN nel Motore di database indicano chiaramente che esistono restrizioni sulle operazioni DDL che possono essere eseguite in una transazione esplicita in esecuzione con l’isolamento dello snapshot , ma non sto utilizzando l’isolamento dello snapshot e ciò dovrebbe comportare un errore.
    • Questo potrebbe essere interpretato in modo che le operazioni DDL possano essere eseguite in una transazione esplicita con diversi livelli di isolamento?
  • Guida per l’utente di Oracle® Database Gateway per SQL Server # Le istruzioni DDL affermano che è ansible eseguire una sola istruzione DDL in una determinata transazione : è valido anche per SQL Server utilizzato direttamente?

Per Oracle:

  • All’interno della domanda SO Unità che verifica le istruzioni DDL che devono essere presenti in una transazione , si dice che Oracle esegue il commit implicito per una dichiarazione DDL? (anche se non ci sono riferimenti)

Se è importante, lo sto facendo con Java attraverso il driver JDBC JTDS.

grazie Touko

So che molti database hanno restrizioni, ma Postgres no. È ansible eseguire creazioni di tabelle numeriche, modifiche alle colonne e modifiche dell’indice in una transazione e le modifiche non sono visibili agli altri utenti che COMMIT ha esito positivo. Ecco come dovrebbero essere i database! 🙂

Per quanto riguarda SQL Server, è ansible eseguire DDL all’interno di una transazione, ma SQL Server non esegue i metadati della versione e pertanto le modifiche saranno visibili agli altri prima che la transazione venga eseguita . Ma alcune istruzioni DDL possono essere ripristinate se si è in una transazione , ma per quali funzionano e quali no, è necessario eseguire alcuni test.

Se stai creando tabelle, viste, ecc al volo (diverse dalle variabili di tabella o dalle tabelle temporanee), potresti davvero aver bisogno di ripensare il tuo progetto. Questo non è roba che dovrebbe normalmente accadere dall’interfaccia utente. Anche se è necessario consentire alcune personalizzazioni, le istruzioni DDL non dovrebbero accadere contemporaneamente all’inserimento di inserimenti / aggiornamenti / eliminazioni transazionali. È molto meglio separare queste funzioni.

Questo è anche qualcosa che richiede una buona dose di considerazione e test su ciò che accade quando due utenti provano a cambiare la struttura della stessa tabella nello stesso momento e quindi eseguono una transazione per inserire i dati. C’è qualcosa di veramente spaventoso che può accadere quando si consente agli utenti di apportare modifiche alla struttura del database.

Inoltre alcune istruzioni DDL devono sempre essere la prima dichiarazione di un batch. Cercalo anche quando li stai facendo.

Per il caso generale e IIRC, non è sicuro assumere che le istruzioni DDL siano transazionali.

Vale a dire, c’è un ampio margine di manovra su come le alterazioni dello schema interagiscono all’interno di una transazione (supponendo che lo faccia affatto). Questo può essere fatto dal venditore o anche dall’installazione specifica (cioè fino al dba), credo. Quindi, per lo meno, non utilizzare un DBMS per supporre che altri tratteranno le affermazioni DDL.

Modifica: MySql è un esempio di DBMS che non supporta affatto le transazioni DDL. Inoltre, se si dispone di replica / mirroring del database, è necessario prestare molta attenzione al fatto che il servizio di replica (la replica di Sybase è la norma, che ci crediate o meno) replicherà effettivamente l’istruzione DDL.

Potrebbe essere che in MS SQL, le transazioni implicite vengano triggerste quando vengono eseguite istruzioni DDL e DML. Se distriggerste questo aiuto, usate SET IMPLICIT_TRANSACTIONS

EDIT: un’altra possibilità: non è ansible combinare CREATE VIEW con altre istruzioni nello stesso batch. CREATE TABLE è ok. Separare i lotti con GO.

EDIT2: È ansible utilizzare più DDL in una transazione purché separati con GO per creare diversi batch.