我是 JDBC 新手,我正在尝试更新数据库中的 2 个表,因此我想在 1 个事务中完成此操作,这样如果一个查询失败,另一个查询也应该失败。我想提供这样的行为,或者只是有机会在其中一个失败时进行回滚。
这是我的两个疑问:
int i = stmt.executeUpdate("INSERT INTO product (title, price, `status`) " +
"VALUES ( \"" + product.getTitle() + "\", " + product.getPrice() + ", " + product.getStatus().ordinal() + ");");
int j = stmt.executeUpdate("INSERT INTO product_categories (product_id, category_id) " +
"VALUES (last_insert_id(), " + categoryId + ");");
如果想原子地执行多条语句,则需要使用事务。 JDBC 连接默认为“自动提交”模式,这意味着每个语句都在其自己的事务中执行。因此,您首先需要使用
Connection.setAutoCommit(false)
禁用自动提交模式。
关闭自动提交模式后,执行的语句将在当前事务中执行,如果当前没有事务,则启动一个事务。然后可以使用
Connection.commit()
提交此事务,或使用 Connection.rollback()
回滚此事务。
您需要执行以下操作:
try (Connection connection = DriverManager.getConnection(...)) {
connection.setAutoCommit(false);
try (Statement stmt = connection.createStatement()) {
stmt.executeUpdate(<your first update>);
stmt.executeUpdate(<your second update>);
connection.commit();
} catch (SQLException e) {
connection.rollback();
throw e;
}
}
有关更多详细信息,请参阅 JDBC 教程章节使用事务。
请了解准备好的陈述。将值连接到查询字符串中是不好的,因为如果忘记转义值,可能会导致 SQL 注入或奇怪的错误。另请参阅 JDBC 教程章节使用准备好的语句。