gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:13:17 30 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/35535251/

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