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

标签 java mysql jdbc

我是 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/

相关文章:

java - 在 Kotlin 中用成员表达 Java 注解类

java - 使用PreparedStatement 没有数据插入到我的数据库中

java - 使用 hibernate 连接到数据库 - 连接 url

java - 如何使用java从Excel单元格中获取超链接地址?

java - 在 Java 中使用 Pushetta 发送推送通知会导致 403 Forbidden

mysql - 我可以使用 Electron JS 将我的 Web 应用程序转换为桌面应用程序吗

mysql - 如何在mysql的外键约束中允许0?

java - 如果结果集不可滚动,则绝对函数不应该工作

java - 生成列名行

java - 在信封上绘制文字