我正在使用一个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自动提交(False)不起作用)没有帮助。
发布于 2020-05-15 06:22:12
问题:当我执行此操作时,它会创建该表并自动提交它,但它不应该。
对,无论自动提交设置如何,任何DDL都将始终被提交。
此行为不特定于MySQL,请参阅自动提交。
大多数数据库管理系统(例如,MariaDB)强制对每个DDL语句进行自动提交,即使在非自动提交模式下也是如此。在这种情况下,在每个DDL语句之前,事务中的以前的DML语句都是自动提交的。每个DDL语句都在自己的新的自动提交事务中执行。
也许临时表能帮你。
创建表时可以使用临时关键字。临时表仅在当前会话中可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名,而不会相互冲突,或者使用同名的现有非临时表。(现有表被隐藏,直到临时表被删除。)
发布于 2020-05-15 06:22:09
MySQL DDL,即创建表不是事务性的
参考文献导致隐式提交的事务
发布于 2020-05-15 06:25:31
数据操作语句是事务性语句,而不是数据定义语句。
因此仍然提交了create/alter或drop。
https://stackoverflow.com/questions/61812953
复制相似问题