Java 在MySQL DBMS中使用JDBC驱动程序时,如何回滚CREATETABLE和DROP TABLE等DDL语句?
我有一个示例代码,它创建一个表,在其中插入一些行,然后尝试取消整个事务,但是Java 在MySQL DBMS中使用JDBC驱动程序时,如何回滚CREATETABLE和DROP TABLE等DDL语句?,java,mysql,jdbc,rollback,Java,Mysql,Jdbc,Rollback,我有一个示例代码,它创建一个表,在其中插入一些行,然后尝试取消整个事务,但是conn.rollback()似乎只对INSERT语句有效,而CREATE table保持不受影响:新创建的表在数据库中保持永久性,没有插入行 这是在MySQL DBMS中使用JDBC驱动程序时的标准行为吗 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Sta
conn.rollback()
似乎只对INSERT语句有效,而CREATE table保持不受影响:新创建的表在数据库中保持永久性,没有插入行
这是在MySQL DBMS中使用JDBC驱动程序时的标准行为吗
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestBatch {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC",
"root", "root")) {
// drop table
try (Statement dropStatement = conn.createStatement()) {
dropStatement.executeUpdate("DROP TABLE IF EXISTS mytable");
}
// create table, insert rows and rollback
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
stmt.addBatch("CREATE TABLE mytable (id INT)");
stmt.addBatch("INSERT INTO mytable VALUES (1)");
stmt.addBatch("INSERT INTO mytable VALUES (2)");
stmt.executeBatch();
conn.rollback();
} finally {
conn.setAutoCommit(true);
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}
}
}
请注意,我使用的是带有连接器/J版本的MySQL Server 8.0。8.0.17,参数default storage engine(在C:\ProgramData\MySQL\MySQL Server 8.0\my.ini中)也设置为INNODB。正如Paul Spiegel和Arnaud所说,DDL语句不能在MySQL中回滚。即使是MySQL 8也是如此:
不管是好是坏,如果DDL语句是本地的,并且不能在XA事务中使用,则DDL语句会提交任何挂起的事务(因为这会导致一个参与者在事务协调器不发出命令的情况下提交数据)。DDL在MySQL中自动提交。您不能这样做,请参阅以下链接: