2010-12-03 11 views
0

私はDBをアップグレードするための方法があります。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 INDEXDROP ...)は常にトランザクション制御外で発生します。

これは、IIRC Postgresがよりうまく処理できる弱点ですが、MySQLではロールバックの場合には変更を元に戻す必要があります。

関連する問題