2012-04-05 4 views
0

Ich habe eine Methode, die ein einfaches mysql einfügen tut, als ich versuchte, den Einsatz Aktion wie folgt, auf einem Fehler rückgängig zu machen, aber es ist rollingback nicht auf Fehler, bitte helfen Sie mir,Rollback funktioniert nicht in Java

public void addFamer(FamerDTO famer) throws Exception { 
     Connection con = JDBCConnectionPool.getInstance().checkOut(); 
     con.setAutoCommit(false); 

     try { 


      String generalFamerDataSQL = "INSERT INTO famers(famer_code, name_wt_initials, full_name, gender, " 
        + "nic_or_passport_no, sc_possition, phone_home, phone_mobile, phone_office) VALUES(?,?,?,?,?,?,?,?,?)"; 
      PreparedStatement insertFamerPS = con.prepareStatement(generalFamerDataSQL, PreparedStatement.RETURN_GENERATED_KEYS); 
      insertFamerPS.setString(1, famer.getFamerCode()); 
      insertFamerPS.setString(2, famer.getNameWithInitials()); 
      insertFamerPS.setString(3, famer.getNameInFull()); 
      insertFamerPS.setString(4, famer.getGender()); 
      insertFamerPS.setString(5, famer.getNICorPassportNo()); 
      insertFamerPS.setString(6, famer.getSocietyPosission()); 
      insertFamerPS.setString(7, famer.getHomePhone()); 
      insertFamerPS.setString(8, famer.getMobilePhone()); 
      insertFamerPS.setString(9, famer.getOfficePhone()); 
      insertFamerPS.execute(); 


String famerRelations = "INSERT INTO org_reg_blk_soc_fmr(org_id, region_id, famer_id, block_id, soc_id) " 
        + "VALUES (?,?,?,?,?)"; 
      PreparedStatement famerRelationsPS = con.prepareStatement(famerRelations); 
      famerRelationsPS.setInt(1, famer.getOrganization().getOrg_id()); 
      famerRelationsPS.setInt(2, famer.getRegion().getRegion_id()); 
      famerRelationsPS.setInt(3, famerID); 
      famerRelationsPS.setInt(4, famer.getBlock().getBlockId()); 
      famerRelationsPS.setInt(6, famer.getSociety().getSoc_id()); //intentionally made an error here to test, put index as 6 for 5 
      famerRelationsPS.execute(); 


      con.commit(); 
     } catch (Exception e) { 
      if (con != null) { 
       logger.info("Rolling back!"); 
       con.rollback();      
      } 
      logger.error(e.getLocalizedMessage()); 

     } finally { 
      con.setAutoCommit(true); 
      JDBCConnectionPool.getInstance().checkIn(con); 
     } 

    } 

Sobald diese Methode mit den erforderlichen Parametern aufgerufen wird, da ein Fehler in der zweiten Einfügeanweisung vorliegt, erwartete ich, die erste Einfügeaktion rückgängig zu machen. Aber wenn der Fehler angezeigt wird, wird der Datenbank durch die erste insert-Anweisung ein Datensatz hinzugefügt.

+0

Haben Sie versucht, eine neue Transaktion vor dem Einfügen explizit zu starten? –

Antwort

7

Nur um zu überprüfen - Was ist der Tabellentyp, den Sie verwenden? Bei der letzten Verwendung von MySQL haben MyISAM -Tabellen keine Transaktionen unterstützt, was bedeutet, dass Sie einen anderen Tabellentyp verwenden müssen, z. InnoDB.

+0

(entfernt -1) als wäre es die erste Sache zu fragen/zu sehen. –

+0

Vielen Dank Rory, meine MySQL-Tabellen waren MyISAM, also habe ich sie in innodb geändert und dann funktioniert es. – Harsha

+0

@Harsha Sie sollten diese Antwort akzeptieren, wenn es Ihr Problem gelöst hat :) – Jim