Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在MySQL DBMS中使用JDBC驱动程序时,如何回滚CREATETABLE和DROP TABLE等DDL语句?_Java_Mysql_Jdbc_Rollback - Fatal编程技术网

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中自动提交。您不能这样做,请参阅以下链接: