2010-12-03 4 views
0

У меня есть метод для обновления БД:Обновление пакета SQL - откат на "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(); 
} 

И обновить метод:

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')"); 
} 

ошибка в INSERT только для тестирования отката.

Ну, проблема в том, что он не откатывает CREATE TABLE project. Стол - InnoDB. Какие-либо предложения?

ответ

2

Это не поддерживается MySQL/InnoDB. Все заявления DDL (CREATE TABLE, ALTER TABLE, CREATE INDEX, DROP ...) всегда происходят вне контроля транзакций.

Это слабый момент, с которым IIRC Postgres может справиться лучше, но с MySQL вы должны обойти это, возвращая изменения самостоятельно в случае откатов.

Смежные вопросы