Oracle
 sql >> Base de données >  >> RDS >> Oracle

JDBC et Oracle conn.commit et conn.setAutocommit ne fonctionnent pas correctement

TRUNCATE est une commande DDL (Data Definition Language) qui s'engage implicitement. Il n'aurait rien commis si vous aviez utilisé le DELETE déclaration à la place.

// Deletes ALL Rows; No WHERE Clause
pstmnt.executeQuery("DELETE FROM bd_vehicles_temp_");

La raison TRUNCATE est une instruction DDL est qu'elle supprime les données de la table directement sans les copier dans le Rollback Tablespace . C'est pourquoi TRUNCATE est plus rapide mais ne peut pas être annulé.

MODIFIER :(Pourquoi mes INSERTs s'engagent aussi ?)

C'est parce que vous fermez votre Connexion sans appeler Connection#rollback () .

Si une Connexion est fermé sans un commit explicite ou un rollback; JDBC n'impose rien de particulier ici et, par conséquent, le comportement dépend du fournisseur de la base de données. Dans le cas d'Oracle, un commit implicite est émis.

DONC, juste rollback() vos modifications avant de fermer votre Connexion dans le enfin bloquer

pstmnt = conn.createStatement();

pstmnt.executeQuery("DELETE FROM bd_vehicles_temp_1");
System.out.println("Query Executed");

conn.rollback();
System.out.println("Changes rolled back");