簡體   English   中英

如何使用JDBC在一個事務中執行2個更新查詢

[英]How to execute 2 update queries in one transaction with JDBC

我是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教程章節“ 使用准備好的語句”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM