esc*_*380 1 java mysql jdbc rollback
我有一个示例代码,它创建一个表,在其中插入一些行,然后尝试取消整个事务,但是conn.rollback()似乎只对INSERT语句有效,而CREATE TABLE却不受影响:新创建的表在数据库中保持永久不变,没有插入任何行。
将JDBC驱动程序与MySQL DBMS一起使用时,这是标准行为吗?
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用的是带有Connector / 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也是如此:https : //dev.mysql.com/doc/refman/8.0/en/implicit-commit.html
不管是好是坏,DDL语句都会提交任何未决的事务(如果它们是本地事务并且不能在XA事务中使用)(因为这将导致一个参与者提交数据,而事务协调器不会发出该命令)。