2012-05-04 13 views
7

Ho notato alcuni programmatori che utilizzano COMMIT altri utilizzando conn.setAutoCommit (true); per terminare la transazione o eseguire il rollback, quindi quali sono i vantaggi dell'utilizzo di uno anziché dell'altro? Dov'è la differenza principale?COMMIT O conn.setAutoCommit (true)

conn.setAutoCommit(true); 

oltre

statement.executeQuery(query); 
statement.commit(); 
+1

Sono strumenti separati per scopi diversi. Uno non è "migliore" o "più corretto" rispetto all'altro. – Affe

+0

quando si utilizza il client di commit sulla rete non è possibile visualizzare i nuovi record anche se si aggiorna il loro set di risultati, ma se impostato su autocommit true, funziona correttamente, questo è il mio problema. – Motasem

+0

Queste domande mostrano un fraintendimento su quali siano i due metodi. Come Affe ha detto, non sono assolutamente la stessa cosa. Quando la modalità di commit automatico è abilitata, allora ogni istruzione viene commessa automaticamente. Quando è abilitato, le transazioni sono avviate in modo implicito e commit() deve essere chiamato per eseguirle effettivamente (anche quando una transazione non è stata avviata in modo esplicito). commit() commette una transazione aperta. setAutoCommit determina se le transazioni sono avviate in modo implicito o esplicito (sorta di). – Corbin

risposta

9

Si dovrebbe in uso generale Connection.commit() e non Connection.setAutoCommit(true) per eseguire il commit di una transazione, a meno che non si desideri passare dall'utilizzo della transazione al modello 'transaction per statement' di autoCommit.

Detto questo, chiamando Connection.setAutoCommit(true) mentre si trova in una transazione, si impegna la transazione (se il driver è un reclamo con la sezione 10.1.1 della specifica JDBC 4.1). Ma in realtà dovresti farlo sempre solo se intendi rimanere in autoCommit dopo, poiché l'abilitazione/disabilitazione di autoCommit su una connessione potrebbe avere un overhead più elevato su una connessione piuttosto che semplicemente un commit (ad esempio perché deve passare da un gestore di transazione all'altro, effettuare controlli aggiuntivi , eccetera).

È inoltre necessario utilizzare Connection.commit() e non utilizzare il comando SQL nativo COMMIT. Come dettagliato nella documentazione della connessione:

Nota: quando si configura una connessione, le applicazioni JDBC devono utilizzare il metodo di connessione appropriato come setAutoCommit o setTransactionIsolation. Le applicazioni non dovrebbero invocare comandi SQL direttamente per modificare la configurazione della connessione quando è disponibile un metodo JDBC.

Il fatto è che i comandi come commit() e SetAutoCommit(boolean) possono fare più lavoro nella terra posteriore, come chiudere ResultSets e la chiusura o il ripristino Statements. L'utilizzo del comando SQL COMMIT eviterà questo e potenzialmente porterà il driver/connessione in uno stato errato.

+0

Questo non è ciò che l'utente stava chiedendo. – Corbin

+0

@Corbin Ho aggiornato la mia risposta. Mi sono concentrato troppo su 'COMMIT' nel testo. –

4

L'utilizzo di conn.setAutoCommit(); vale per la connessione e vi dà la possibilità di eseguire query X in una singola transazione, o utilizzare una sola transazione per execute

Come il API descrive:

void setAutoCommit(boolean autoCommit) 
        throws SQLException 

Imposta la modalità di commit automatico di questa connessione allo stato specificato. Se una connessione è in modalità di commit automatico , tutte le sue istruzioni SQL verranno eseguite e commesse come transazioni singole . In caso contrario, le sue istruzioni SQL sono raggruppate in transazioni che vengono terminate da una chiamata al metodo commit o al rollback del metodo. Per impostazione predefinita, le nuove connessioni sono in modalità

auto-impegnarsi, per un semplice caso:

conn.setAutoCommit(false); 
statement.executeQuery(query); 
statement.commit(); 

sarà lo stesso di:

conn.setAutoCommit(true); 
statement.executeQuery(query); 
+0

si dovrebbe anche mostrare la differenza quando si usano 2 inserimenti/aggiorna/cancella le istruzioni in un unico metodo –

+0

se conn.setAutoCommit (true); quindi non sarò salvato poiché ACID è una priorità qui, ma posso usare conn.setAutoCommit (false); statement.executeQuery (query); statement.commit(); conn.setAutoCommit (true); e quale sarà il riflesso in questo caase? – Motasem

+0

@Motasem ma 'conn.setAutoCommit (true); statement.executeQuery (query); 'farà lo stesso di' conn.setAutoCommit (false); Statement.executeQuery (query); statement.commit(); 'verifica se il tuo' statement.commit() 'viene chiamato con successo e non restituisce alcuni' SQLException' – MrJames

Problemi correlati