Java Gold SE11対策:トランザクション制御とは?AutoCommitとcommit/rollbackの本当の意味

アイキャッチ画像

「データベースに接続してSQLを実行する」だけでは、本当のJDBCは使いこなせません。
実務では「一連の処理をまとめて成功させる」ための トランザクション制御 が不可欠です。
この回では、AutoCommit の挙動や commit()/rollback() の意味を丁寧に解説していきます。

そもそもトランザクションとは?

トランザクションとは、「一連の処理をひとまとまりにして、全部成功するか、全部失敗にする」という考え方です。
例えば、銀行振込では以下の2つの操作がセットです:

  • Aさんの口座から1万円を引く
  • Bさんの口座に1万円を足す

どちらか一方だけ成功してしまうと、お金が消えたり増えたりするバグになります。
このような事故を防ぐため、まとめて処理し、最後に確定 or 取り消す必要があるのです。

JDBCにおけるトランザクションの流れ

conn.setAutoCommit(false);     // 自動コミットを無効化

// SQL文をいくつか実行する

conn.commit();                 // すべて成功したら確定

// エラーが起きたら

conn.rollback();              // 変更を取り消す

conn.getAutoCommit() は何してる?

Connection#getAutoCommit() は、SQL文を実行したときに即コミットされるかどうか を返します。

System.out.println(conn.getAutoCommit()); // 通常は true(=即コミット)

この状態では、INSERT や UPDATE を実行した瞬間に データベースへ反映(=確定) されてしまいます。

自動コミットのままだと困るケース

たとえば、以下のような2つのSQLをまとめて処理したいとします:

ps1.executeUpdate(); // 在庫から商品を減らす

ps2.executeUpdate(); // 購入履歴テーブルにレコードを追加

このとき ps1 は成功、ps2 でエラー発生したら…?
在庫だけ減って履歴は残らない=不整合な状態が発生してしまいます。

自動コミットを無効にする:setAutoCommit(false)

これを防ぐには、明示的にトランザクションを開始します:

conn.setAutoCommit(false);

これにより、SQLを実行しても確定しない=保留状態になります。
すべてのSQLが成功した後で、明示的に以下の処理を行います。

🟢 commit():すべての変更を確定

conn.commit();

この1行で、これまで保留していた全てのSQLが データベースに反映される ようになります。

🔴 rollback():すべての変更を取り消す

conn.rollback();

エラーやバリデーション失敗が起きた場合は、実行済みのSQLをすべて無かったことにする ことができます。
これにより、データの整合性が保たれます。

コード例:典型的なトランザクション処理

conn.setAutoCommit(false); // 明示的に開始

try {

    // 複数の更新処理

    ps1.executeUpdate();

    ps2.executeUpdate();

    conn.commit(); // すべて成功したら確定

} catch (SQLException e) {

    conn.rollback(); // どれか失敗したら全部キャンセル

}

この形は 試験でも実務でも頻出なので、構造ごと覚えましょう。

Java Gold試験で問われるポイント

  • conn.setAutoCommit(false) を書かないと commit() や rollback() は無意味
  • AutoCommit = true ではSQLごとに即コミットされる
  • 複数のSQLをまとめて1つのトランザクションにするなら 明示的に false にすること
  • try-catch-finally で エラー時 rollback、成功時 commit する構文に慣れておく

まとめ:要点

概念・メソッド内容
トランザクション一連のSQLをまとめて成功・失敗させる処理単位
conn.getAutoCommit()自動コミットが有効かどうか(通常は true)
conn.setAutoCommit(false)自動コミットを無効にして明示的な制御を可能にする
conn.commit()成功したら確定(データベースに反映)
conn.rollback()失敗時はすべてキャンセル(整合性維持)