Пакетное обновление SQL - откат на "CREATE TABLE"? - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть метод обновления БД:

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. Есть предложения?

1 Ответ

2 голосов
/ 03 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...