我有一个升级DB的方法:
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。有什么建议吗?
发布于 2010-12-03 15:46:23
MySQL/InnoDB不支持。所有的DDL语句(CREATE TABLE、ALTER TABLE、CREATE INDEX、DROP ...)总是发生在事务控制之外。
这是IIRC Postgres可以更好地处理的一个弱点,但是使用MySQL时,您必须通过在回滚的情况下自己恢复更改来解决这个问题。
https://stackoverflow.com/questions/4343436
复制相似问题