escudero380:
私は、テーブルを作成するサンプルコードを、持っていることで、いくつかの行を挿入して、トランザクション全体をキャンセルしようとしますが、conn.rollback()
CREATE TABLEは影響を受け続けている間のみ、INSERT文に効果があるようです:新しく作成されたテーブルはと、データベースに永続的なまま行は、それに挿入されていません。
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());
}
}
}
、ノート、私はうたのConnector / Jを使用してMySQLサーバ8.0を使用していてください。8.0.17は、また、パラメータのデフォルトストレージエンジン(Cで:\はProgramData \のMySQL \ MySQLサーバ8.0 \ my.iniファイルは、)に設定されているINNODB。
ブライアン:
ポール・シュピーゲルとアルノーが言ったように、DDL文は、MySQLにロールバックすることはできません。:これはさえMySQLの8のために真であるhttps://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html
彼らはローカルであり、(それがそうするようにコマンドを発行するトランザクションコーディネータせずにデータをコミットするために一人の参加者を引き起こすため)XAトランザクションで使用することができない場合は良くも悪くも、DDL文は、保留中のトランザクションをコミットします。