MySQLのDBMSでJDBCドライバを使用しながら、どのようにロールバックのDDL文に、このようなTABLEやDROP TABLEを作成しますか?

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文は、保留中のトランザクションをコミットします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=315130&siteId=1