[英]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.