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

问题描述 投票:0回答:1

我是 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 + ");");
java mysql jdbc
1个回答
20
投票

如果想原子地执行多条语句,则需要使用事务。 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 教程章节使用准备好的语句

© www.soinside.com 2019 - 2024. All rights reserved.