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.
fonte
2012-05-05 08:08:18
Sono strumenti separati per scopi diversi. Uno non è "migliore" o "più corretto" rispetto all'altro. – Affe
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
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