2011-02-01 2 views
8

Sto tentando di eseguire due query di inserimento in uno Statement, riunendole in un'unica transazione.Esegui due query diverse in una transazione

stavo guardando il metodo addBatch, ma se ho capito bene può essere utilizzato con una sola PreparedStatement per eseguire lo stesso inserto più volte con parametri diversi, o essere utilizzata su un oggetto Statement per aggiungere più query al lotto , ma senza la possibilità di aggiungere parametri (quindi potrei essere in grado di aggiungere i valori nella stringa sql. Stile di iniezione SQL).

Ho anche provato un approccio ingenuo di scrittura di entrambi gli inserimenti in una istruzione sql (insert into table1 values(?, ?); insert into table2 values(?, ?);), ma in questo modo lo PreparedStatement vede solo i primi due parametri e tenta di impostare il 3 ° e il 4 ° genera un'eccezione.

+3

Per curiosità, qual è la vostra ragione per non voler usare due 'PreparedStatement' nella stessa transazione? Questo ti renderebbe la vita più facile! –

+0

Sì, immagino che non ci sia un motivo speciale per non farlo, a parte non pensarci. Grazie per segnalarlo. –

risposta

22

È possibile disattivare autocommit, eseguire due prospetti separati e quindi eseguire il commit di una transazione manualmente:

connection.setAutoCommit(false); 
try { 
    ... 
    stmt1.execute(); 
    ... 
    stmt2.execute(); 
    connection.commit(); 
} catch (Exception ex) { 
    connection.rollback(); 
}