sql >> Database >  >> RDS >> Oracle

JDBC en Oracle conn.commit en conn.setAutocommit werken niet goed

TRUNCATE is een Data Definition Language (DDL)-opdracht die impliciet vastlegt. Het zou niets hebben vastgelegd als je de DELETE . had gebruikt verklaring in plaats daarvan.

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

De reden TRUNCATE is een DDL-statement is dat het de tabelgegevens direct verwijdert zonder deze naar de Rollback Tablespace te kopiëren . Daarom TRUNCATE is sneller maar kan niet worden teruggedraaid.

BEWERKEN :(Waarom worden mijn INSERT's ook vastgelegd?)

Dat komt omdat je je Verbinding verbreekt zonder Connection#rollback te bellen () .

Als een Verbinding is gesloten zonder een expliciete toezegging of een terugdraaien; JDBC verplicht hier niets in het bijzonder en daarom is het gedrag afhankelijk van de databaseleverancier. In het geval van Oracle, een impliciete commit wordt uitgegeven.

DUS, gewoon rollback() uw wijzigingen voordat u uw Verbinding sluit in de eindelijk blok

pstmnt = conn.createStatement();

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

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


  1. recursieve functie categorie database

  2. Mysql Datediff-query

  3. Wat is de beste manier om historische gegevens op te slaan in SQL Server 2005/2008?

  4. Voer native sql uit met hibernate