Oracle
 sql >> Datenbank >  >> RDS >> Oracle

JDBC und Oracle conn.commit und conn.setAutocommit funktionieren nicht richtig

TRUNCATE ist ein DDL-Befehl (Data Definition Language), der implizit festgeschrieben wird. Es hätte nichts festgeschrieben, wenn Sie DELETE verwendet hätten Anweisung statt.

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

Der Grund TRUNCATE Eine DDL-Anweisung ist, dass sie die Tabellendaten direkt entfernt, ohne sie in den Rollback Tablespace zu kopieren . Deshalb TRUNCATE ist schneller, kann aber nicht zurückgesetzt werden.

BEARBEITEN :(Warum werden auch meine INSERTs übergeben?)

Das liegt daran, dass Sie Ihre Verbindung schließen ohne Connection#rollback aufzurufen () .

Wenn eine Verbindung wird ohne explizites commit geschlossen oder ein Rollback; JDBC schreibt hier nichts Besonderes vor und daher ist das Verhalten vom Datenbankanbieter abhängig. Im Fall von Oracle ein implizites commit ausgegeben wird.

Also, einfach rollback() Ihre Änderungen, bevor Sie Ihre Verbindung schließen im endlich blockieren

pstmnt = conn.createStatement();

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

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