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() | 失敗時はすべてキャンセル(整合性維持) |