019 例外と例外処理(トランザクションとロールバック) 034 解答例


以下は、データベース内の複数のテーブルに変更を加え、一部のテーブルでの変更が成功し、他のテーブルでの変更が失敗した場合にトランザクションをロールバックし、エラーメッセージを表示する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メソッドがそれぞれ異なるテーブルの変更を担当しています。トランザクション内でのエラー発生時には、トランザクション全体をロールバックしています。

「019 例外と例外処理」問題集リスト