为什么在放置setAutoCommit(false)后仍然自动提交连接?

问题描述 投票:0回答:3

我正在使用MySQL数据库。

我有这样的代码:

public class Test {

    public static void main(String[] args) throws SQLException {
        String url = "....";
        String username = "...";
        String password = "...";
        DriverManager.registerDriver(new Driver());
        Connection connection = DriverManager.getConnection(url, username, password);
        connection.setAutoCommit(false);
        Statement stmt = connection.createStatement();
        stmt.execute("create table if not exists customer1\r\n" + "(\r\n"
                + "customer_name varchar(20) not null primary key,\r\n" + "customer_street varchar(20),\r\n"
                + "customer_city varchar(10)\r\n" + ")");
        // connection.commit();  
        connection.close();

    }

}

问题:执行此操作时,它会创建表并自动提交,但不应该提交。

我做了connection.setAutoCommit(false)并注释了connection.commit()进行测试,然后为什么要提交?

此问题(jdbc autocommit(false) doesnt work)没有帮助。

java mysql jdbc
3个回答
2
投票

问题:执行此命令时,它将创建表并提交自动,但不应该。

正确,无论自动提交设置如何,任何DDL都将始终被提交。

此行为并非特定于MySQL,请参见Autocommit

大多数DBMS(例如MariaDB)会强制自动提交每个DDL语句,即使在非自动提交模式下也是如此。在这种情况下,在每个DDL语句之前,自动提交事务中的先前DML语句。每个DDL语句在其自己的新自动提交事务中执行。

也许TEMPORARY TABLE可能会帮助您。

您可以在创建表时使用TEMPORARY关键字。暂时的该表仅在当前会话中可见,已被删除会话关闭时自动执行。这意味着两个不同的会话可以使用相同的临时表名称,而无需彼此冲突或与现有的非TEMPORARY表冲突同名。 (现有表一直隐藏到临时表掉了。)


1
投票

MySQL DDL,即创建表不是事务性的>>

参考transactions that cause implicit commit


1
投票

数据操作语句是事务性的,而不是数据定义语句。

© www.soinside.com 2019 - 2024. All rights reserved.