2011-02-09 16 views
39

Connection.setTransactionIsolation(int) avverte:Come avviare una transazione in JDBC?

Nota: Se questo metodo viene chiamato durante una transazione, il risultato è definito dall'implementazione.

Questo solleva la domanda: come si inizia una transazione in JDBC? È chiaro come terminare una transazione, ma non come iniziare.

Se un Connection inizia all'interno di una transazione, come è possibile richiamare Connection.setTransactionIsolation(int) all'esterno di una transazione per evitare un comportamento specifico dell'implementazione?

risposta

37

Rispondendo alla mia domanda:

  • connessioni JDBC iniziano con modalità auto-commit abilitato, in cui ogni istruzione SQL è implicitamente delimitata con una transazione.
  • Gli utenti che desiderano eseguire più istruzioni per transazione devono attivare auto-commit off.
  • La modifica della modalità di commit automatico attiva un commit della transazione corrente (se uno è attivo).
  • Connection.setTransactionIsolation() può essere invocato in qualsiasi momento se il commit automatico è abilitato.
  • Se il commit automatico è disabilitato, Connection.setTransactionIsolation() può essere richiamato solo prima o dopo una transazione. Invocarlo nel mezzo di una transazione porta a un comportamento indefinito.

Fonti:

17

vi consiglio di leggere this vedrete

Pertanto, la prima chiamata di setAutoCommit (false) e ogni chiamata di commit() implicitamente segnare l'inizio di una transazione. Le transazioni possono essere annullata prima che vengano commessi da chiamando

Edit:

Controllare la documentazione ufficiale sulle Operazioni JDBC

Quando si crea una connessione, è in auto- modalità commit. Ciò significa che ogni singola istruzione SQL viene trattata come una transazione ed è commesso automaticamente subito dopo l'esecuzione. (Per essere più precisi, il valore predefinito è che un'istruzione SQL sia impegnata quando è completata, non quando viene eseguita. Una dichiarazione è completata quando sono stati recuperati tutti dei suoi set di risultati e conteggi di aggiornamento. tutti i casi, tuttavia, una dichiarazione è completata, e quindi impegnati, subito dopo viene eseguito.)

il modo per consentire a due o più istruzioni per essere raggruppati in una transazione è quello di disabilitare la modalità auto-commit . Questo è dimostrato nel seguente codice, dove con è una connessione attiva:

con.setAutoCommit (false);

Fonte

: JDBC Transactions

+2

non riesco a trovare la citazione di cui sopra sulla pagina collegato a. Inoltre, preferisco di gran lunga trovare una citazione nella specifica JDBC in contrasto con alcune citazioni non fornite su devx (supponendo che sia unsourced, cioè). – Gili

+0

+1 per lo spettrale !! – Necronet

16

JDBC delimita implicitamente ogni interrogazione/aggiornamento si esegue in connessione con una transazione. È possibile personalizzare questo comportamento chiamando setAutoCommit (false) per disattivare la modalità di commit automatico e chiamare il commit()/rollback() per indicare la fine di una transazione. Codice Pesudo

try 
{ 
    con.setAutoCommit(false); 

    //1 or more queries or updates 

    con.commit(); 
} 
catch(Exception e) 
{ 
    con.rollback(); 
} 
finally 
{ 
    con.close(); 
} 

Ora, c'è un tipo nel metodo che hai mostrato. Deve essere setTransactionIsolation (livello int.) e non è l'API per la demarcazione delle transazioni.Gestisce come/quando le modifiche apportate da un'operazione diventano visibili ad altre operazioni simultanee, il "I" in ACIDO (http://en.wikipedia.org/wiki/Isolation_(database_systems))

+0

Dove dice che setAutoCommit (false) denota l'inizio di una transazione? – Gili

+0

La risposta non indica quando è sicuro invocare setTransactionIsolation(). Perché Javadoc legge "Nota: se questo metodo viene chiamato durante una transazione, il risultato è definito dall'implementazione."? – Gili

+0

un altro consiglio: sii carino e ripristina lo stato precedente di AutoCommit: booleano previousAutoCommit = conn.getAutoCommit(); try {...} finally {conn.setAutoCommit (previousAutoCommit)} – voho

9

In realtà, this page from the JDBC tutorial sarebbe una lettura migliore.
Si ottiene la connessione, si imposta il livello di isolamento, si eseguono gli aggiornamenti e quindi si esegue il commit o il rollback.

+2

Anche il tutorial non affronta questo problema in modo esplicito. Contiene alcune frasi confuse come: "È consigliabile disabilitare la modalità di auto-commit solo durante la modalità di transazione." Cos'è una "modalità di transazione"? – Gili

+0

@ Gili Dove sei stato morso? –

2

Forse questo sarà rispondere alla tua domanda: Si può avere una sola transazione per ogni connessione. Se autocommit è attivo (impostazione predefinita), ogni selezione, aggiornamento, eliminazione avvia automaticamente e esegue il commit (o il rollback) di una transazione. Se si imposta l'autocommit su Off, si avvia una "nuova" transazione (significa che il commit o il rollback non avverranno automaticamente). Dopo alcune istruzioni, puoi chiamare commit o rollback, che termina la transazione corrente e ne avvia automaticamente una nuova. Non è possibile aprire attivamente due transazioni su una connessione JDBC su JDBC puro.

0

È possibile utilizzare questi metodi per la transazione:

  1. è necessario creare l'oggetto di connessione come con
  2. con.setAutoCommit(false);
  3. le vostre domande
  4. se tutto è vero con.commit();
  5. altro con.rollback();
+1

Questo non aggiunge nulla di nuovo che altre risposte non coprano ... –

1

Startingly, è possibile eseguire manualmente una transazione, se si desidera lasciare la vostra connessione a "setAutoCommit (vero)" modalità, ma vuole ancora una transazione:

try (Statement statement = conn.createStatement()) { 
     statement.execute("BEGIN"); 
     try { 
     // use statement ... 
     statement.execute("COMMIT"); 
     } 
     catch (SQLException failure) { 
     statement.execute("ROLLBACK"); 
     } 
    } 
Problemi correlati