我正在使用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)没有帮助。
问题:执行此命令时,它将创建表并提交自动,但不应该。
正确,无论自动提交设置如何,任何DDL都将始终被提交。
此行为并非特定于MySQL,请参见Autocommit。
大多数DBMS(例如MariaDB)会强制自动提交每个DDL语句,即使在非自动提交模式下也是如此。在这种情况下,在每个DDL语句之前,自动提交事务中的先前DML语句。每个DDL语句在其自己的新自动提交事务中执行。
也许TEMPORARY TABLE可能会帮助您。
您可以在创建表时使用TEMPORARY关键字。暂时的该表仅在当前会话中可见,已被删除会话关闭时自动执行。这意味着两个不同的会话可以使用相同的临时表名称,而无需彼此冲突或与现有的非TEMPORARY表冲突同名。 (现有表一直隐藏到临时表掉了。)
MySQL DDL,即创建表不是事务性的>>
数据操作语句是事务性的,而不是数据定义语句。