gpt4 book ai didi

java - 如何使用 JDBC 在一个事务中执行 2 个更新查询

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:41 25 4
gpt4 key购买 nike

我是 JDBC 新手,我正在尝试更新数据库中的 2 个表,因此我想在 1 个事务中完成此操作,这样如果一个查询失败,另一个查询也应该失败。我想提供这样的行为,或者只是有机会在其中一个失败时进行回滚。

这是我的 2 个查询:

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 教程章节 Using Transactions .

请了解准备好的声明。将值连接到查询字符串中是不好的,因为如果忘记转义值,可能会导致 SQL 注入(inject)或奇怪的错误。另请参阅 JDBC 教程章节 Using Prepared Statements .

关于java - 如何使用 JDBC 在一个事务中执行 2 个更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48329082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com