首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在放置setAutoCommit(false)之后,连接仍然会自动提交?

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

Stack Overflow用户
提问于 2020-05-15 06:18:54
回答 3查看 205关注 0票数 0

我正在使用一个MySQL数据库。

我有这样的密码:

代码语言:javascript
复制
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自动提交(False)不起作用)没有帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-15 06:22:12

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

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

此行为不特定于MySQL,请参阅自动提交。

大多数数据库管理系统(例如,MariaDB)强制对每个DDL语句进行自动提交,即使在非自动提交模式下也是如此。在这种情况下,在每个DDL语句之前,事务中的以前的DML语句都是自动提交的。每个DDL语句都在自己的新的自动提交事务中执行。

也许临时表能帮你。

创建表时可以使用临时关键字。临时表仅在当前会话中可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名,而不会相互冲突,或者使用同名的现有非临时表。(现有表被隐藏,直到临时表被删除。)

票数 2
EN

Stack Overflow用户

发布于 2020-05-15 06:22:09

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

参考文献导致隐式提交的事务

票数 1
EN

Stack Overflow用户

发布于 2020-05-15 06:25:31

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

因此仍然提交了create/alter或drop。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61812953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档