2012-03-02 21 views
42

Quali sono le liste di istruzioni che devono essere confermate prima di ulteriori azioni sul tavolo per evitare un blocco? Non sto parlando di transazioni complete con più dichiarazioni e integrità delle transazioni (invece mi riferisco alle singole dichiarazioni).oracolo: quali istruzioni devono essere confermate?

So che l'inserimento deve essere eseguito ma truncate ha un autocommit. Qual è l'elenco completo delle dichiarazioni che devono essere commesse?

Necessità di essere impegnato (lista di avviamento):

UPDATE 
INSERT 
DELETE 
+1

'truncate' rimuove i dati direttamente senza copiarli in Rollback Tablespace. È una dichiarazione DDL. – danihp

+2

DCL deve essere eseguito? cioè concedere + revocare – toop

+0

Unisci. Seleziona anche per l'aggiornamento accetta i blocchi, anche se non modifica nulla. –

risposta

40

Comandi DML (Lingua di manipolazione dei dati) need to be commited/rolled. Here è un elenco di quei comandi.

Le istruzioni DML (Data Manipulation Language) vengono utilizzate per la gestione dei dati all'interno degli oggetti schema. Alcuni esempi:

SELECT - retrieve data from the a database 
INSERT - insert data into a table 
UPDATE - updates existing data within a table 
DELETE - deletes all records from a table, the space for the records remain 
MERGE - UPSERT operation (insert or update) 
CALL - call a PL/SQL or Java subprogram 
EXPLAIN PLAN - explain access path to data 
LOCK TABLE - control concurrency 
+2

devi eseguire il commit dopo SELECT o EXPLAIN PLAN? – toop

+1

@toop Dopo un 'SELECT ... FOR UPDATE' è necessario per rilasciare il blocco. –

+1

che aspetto ha una selezione per l'aggiornamento? Inoltre, che ne dite di uno standard select * dal tavolo dove blah? – toop

4

DML devono essere commesso o annullate da una rollback. DDL non può.

http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands

È possibile passare l'auto-commit su e questo è ancora una volta solo per DML. DDL non fanno mai parte delle transazioni e quindi non esiste nulla come un commit/rollback esplicito.

truncate è DDL e pertanto attivato in modo implicito.

Modifica
Devo dire scusa. Come @DCookie e @APC dichiarati nei commenti esistono sth come commit impliciti per DDL. Vedi qui per una domanda al riguardo su Ask Tom. Questo è in contrasto con quello che ho imparato e sono ancora un po 'curioso.

+1

devi eseguire il commit dopo SELECT o EXPLAIN PLAN? – toop

+0

Questo è tecnicamente errato: DDL emette sempre commit, e in realtà ne emettono 2, all'inizio e alla fine del processo. Se emetti un'istruzione DML, quindi emetti DDL, il tuo DML viene eseguito il commit. – DCookie

+2

-1. Ovviamente il DDL è impegnato. DDL è essenzialmente l'emissione di modifiche al dizionario dei dati, che devono essere commesse in modo che possano essere applicate. La differenza è semplicemente che i commit sono impliciti e, come afferma DCookie, ce ne sono due. Pertanto, se pubblichiamo un aggiornamento su una tabella e quindi eseguiamo un'istruzione DDL che non riesce, non possiamo eseguire il rollback dell'aggiornamento. È stato eseguito anche se il DDL successivo non è stato applicato. – APC

8

In termini meccanici un commit fa una transazione. Cioè, una transazione è tutta l'attività (una o più istruzioni DML) che si verifica tra due istruzioni COMMIT (o ROLLBACK).

In Oracle un'istruzione DDL è una transazione a sé stante semplicemente perché un COMMIT implicito viene emesso prima che l'istruzione venga eseguita e nuovamente in seguito.

Da una prospettiva di progettazione del sistema una transazione è una business unit di lavoro. Potrebbe consistere in una singola istruzione DML o in una di esse. Non importa: solo le transazioni complete richiedono COMMIT. Letteralmente non ha senso emettere un COMMIT a meno che o fino a quando non abbiamo completato un'intera unità aziendale di lavoro.

Questo è un concetto chiave. I COMMIT non rilasciano solo i blocchi. In Oracle rilasciano anche latch, come l'Elenco transazioni interessate. Ciò ha un impatto a causa del modello di coerenza di lettura di Oracle. Eccezioni come ORA-01555: SNAPSHOT TOO OLD o ORA-01002: FETCH OUT OF SEQUENCE si verificano a causa di commit inappropriati. Di conseguenza, è cruciale che le nostre transazioni restino bloccate per tutto il tempo necessario.

1

E un punto chiave - anche se TRUNCATE TABLE sembra un DELETE senza clausola WHERE, TRUNCATE non è DML, è DDL. DELETE richiede un COMMIT, ma TRUNCATE no.

Problemi correlati