トランザクション管理

Javaのデータベース接続(JDBC)におけるトランザクション管理とは、複数のデータベース操作(INSERT、UPDATE、DELETEなど)をひとまとまりの処理単位(トランザクション)として管理し、一貫性整合性を確保するための仕組みです。トランザクションは、「すべて成功する」か「すべて元に戻す(ロールバック)」かのどちらかで完了します。


1. 自動コミットと手動コミット

JDBCでは、**デフォルトで自動コミットモード(auto-commit)**になっています。これは、各SQL文の実行後に即座にコミットが行われることを意味します。

java
Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn.getAutoCommit()); // true(デフォルト)

トランザクション管理を行うには、自動コミットを無効化し、明示的にコミットまたはロールバックを行う必要があります。

java
conn.setAutoCommit(false); // 自動コミットをオフ

2. トランザクション管理の基本構文

以下は典型的なJDBCのトランザクション処理の例です。

java
try { conn.setAutoCommit(false); // トランザクション開始 PreparedStatement stmt1 = conn.prepareStatement("INSERT INTO users(name) VALUES(?)"); stmt1.setString(1, "Alice"); stmt1.executeUpdate(); PreparedStatement stmt2 = conn.prepareStatement("UPDATE accounts SET balance = balance - 100 WHERE user_id = ?"); stmt2.setInt(1, 1); stmt2.executeUpdate(); conn.commit(); // すべて成功したのでコミット } catch (SQLException e) { conn.rollback(); // エラー発生時はロールバック e.printStackTrace(); } finally { conn.setAutoCommit(true); // 元の状態に戻す }

3. トランザクション管理のポイント

  • 原子性(Atomicity): 一連の処理がすべて成功するか、まったく行われなかったことになる。

  • 一貫性(Consistency): トランザクション実行前後でデータベースが整合性のある状態にあること。

  • 分離性(Isolation): 複数トランザクションが同時に実行されても互いに影響を与えないようにする。

  • 永続性(Durability): コミット後のデータは確実に保存される。


4. 分離レベル(Isolation Level)

JDBCでは、以下のようなトランザクション分離レベルを設定できます。

レベル名 定数 説明
TRANSACTION_READ_UNCOMMITTED Connection.TRANSACTION_READ_UNCOMMITTED 他トランザクションの未確定変更を読める(非推奨)
TRANSACTION_READ_COMMITTED Connection.TRANSACTION_READ_COMMITTED コミット済みの変更だけを読める
TRANSACTION_REPEATABLE_READ Connection.TRANSACTION_REPEATABLE_READ 同じクエリが常に同じ結果を返す
TRANSACTION_SERIALIZABLE Connection.TRANSACTION_SERIALIZABLE 完全な分離(最も厳密だが遅い)
java
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

まとめ

JDBCでのトランザクション管理は、業務処理の正確性とデータ整合性を保つために不可欠です。autoCommit(false) を使ってトランザクションを開始し、commit() または rollback() により結果を確定または取消すことが基本です。特に、複数のSQL文が相互に依存している場合には、必ずトランザクションを明示的に管理する必要があります。

生成日:2025/05/03