以下は、データベース内の複数のテーブルに変更を加え、一部のテーブルでの変更が成功し、他のテーブルでの変更が失敗した場合にトランザクションをロールバックし、エラーメッセージを表示するJavaの例です。なお、具体的なデータベースやテーブルの構造に合わせて変更する必要があります。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class MultiTableTransactionExample {
// データベース接続情報
private static final String JDBC_URL = "jdbc:mysql://localhost:3306/your_database";
private static final String USER = "your_username";
private static final String PASSWORD = "your_password";
public static void main(String[] args) {
try (Connection connection = DriverManager.getConnection(JDBC_URL, USER, PASSWORD)) {
// トランザクション開始
connection.setAutoCommit(false);
try {
// テーブル1の変更
updateTable1(connection);
// テーブル2の変更
updateTable2(connection);
// すべての変更が成功した場合、トランザクションをコミット
connection.commit();
System.out.println("トランザクションが正常に完了しました。");
} catch (SQLException e) {
// 何かしらのエラーが発生した場合、トランザクションをロールバック
connection.rollback();
System.err.println("トランザクションがロールバックされました。エラー: " + e.getMessage());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void updateTable1(Connection connection) throws SQLException {
// テーブル1の変更処理
String sql = "UPDATE table1 SET column1 = ? WHERE id = ?";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
// パラメータをセット
preparedStatement.setString(1, "new_value");
preparedStatement.setInt(2, 1);
// 実行
preparedStatement.executeUpdate();
} catch (SQLException e) {
// テーブル1の変更でエラーが発生した場合
throw new SQLException("テーブル1の変更中にエラーが発生しました。", e);
}
}
private static void updateTable2(Connection connection) throws SQLException {
// テーブル2の変更処理
String sql = "UPDATE table2 SET column1 = ? WHERE id = ?";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
// パラメータをセット
preparedStatement.setString(1, "new_value");
preparedStatement.setInt(2, 1);
// 実行(ここでは敢えてエラーを発生させる)
preparedStatement.executeUpdate();
} catch (SQLException e) {
// テーブル2の変更でエラーが発生した場合
throw new SQLException("テーブル2の変更中にエラーが発生しました。", e);
}
}
}
この例では、updateTable1
メソッドとupdateTable2
メソッドがそれぞれ異なるテーブルの変更を担当しています。トランザクション内でのエラー発生時には、トランザクション全体をロールバックしています。