2010-12-03 8 views
0

J'ai une méthode pour la mise à niveau DB:Mise à jour par lots SQL - restauration sur "CREATE TABLE"?

private void executeUpdateBatch(String... sql) throws SQLException { 
    JdbcConnection connJbdc = new JdbcConnectionImpl(); 
    Connection conn = connJbdc.getConnection(); 
    conn.setAutoCommit(false); 
    Statement st = conn.createStatement(); 

    for(String s : sql) { 
     st.addBatch(s); 
    } 

    try { 
     // execute the batch 
     int[] updateCounts = st.executeBatch(); 
     } catch (BatchUpdateException e) { 
     int[] updateCounts = e.getUpdateCounts(); 
     checkUpdateCounts(updateCounts); 
     try { 
      conn.rollback(); 
     } catch (Exception e2) { 
     } 

     throw new SQLException(e); 
     } 
     // since there were no errors, commit 
     conn.commit(); 

     st.close(); 
     conn.close(); 
} 

et mise à niveau Méthode:

public void upgradeTo5() throws SQLException { 
    executeUpdateBatch("CREATE TABLE project (" 
      + "id INT(10) unsigned NOT NULL auto_increment, " 
      + "title VARCHAR(255) NOT NULL, " 
      + "date_from DATE NULL, date_to DATE NULL," 
      + "active BIT NOT NULL, PRIMARY KEY (id))", 
      "INSERT INTO project(titlea) VALUES('test1')"); 
} 

Une erreur est INSERT juste pour rollback de test.

Eh bien, le problème est maintenant qu'il ne recule pas CREATE TABLE project. La table est InnoDB. Aucune suggestion?

Répondre

2

Ceci n'est pas supporté par MySQL/InnoDB. Toutes les instructions DDL (CREATE TABLE, ALTER TABLE, CREATE INDEX, DROP ...) se produisent toujours en dehors du contrôle des transactions. Il s'agit d'un point faible que IIRC Postgres peut mieux gérer, mais avec MySQL vous devez contourner cela en annulant les changements vous-même en cas de rollbacks.

Questions connexes