カテゴリ: Spring 更新日: 2026/01/22

Springの@Transactional徹底解説!トランザクションの伝播・分離レベル・タイムアウトの基本

トランザクション入門:@Transactional の伝播・分離レベル・タイムアウト
トランザクション入門:@Transactional の伝播・分離レベル・タイムアウト

先生と生徒の会話形式で理解しよう

生徒

「Springの@Transactionalって、どうやって使えばいいんですか?トランザクションって正直難しそうで…」

先生

「確かに最初は戸惑いますよね。でも実は、@Transactionalを使えば、データベースの整合性を保つ処理が簡単に実現できますよ。」

生徒

「伝播とか分離レベルとか、設定項目もたくさんあって不安です…」

先生

「それなら、初心者でも理解しやすいように、基礎から丁寧に説明していきましょう!」

1. Springにおけるトランザクション管理の基本

1. Springにおけるトランザクション管理の基本
1. Springにおけるトランザクション管理の基本

トランザクションとは、データベースへの一連の操作をひとつのまとまりとして扱い、「全部成功したら反映する」「どこかで失敗したら全部なかったことにする」というルールで処理する仕組みです。お金の振り込みであれば、送金元の口座からお金を引き落とす処理と、送金先の口座にお金を振り込む処理が両方成功したときだけ完了とみなし、途中でエラーが起きたら最初からやり直す、といったイメージです。

プログラミング初心者の方は、まず「トランザクションは、関連する処理を安全にまとめるための安全スイッチ」と考えてみてください。ユーザー登録の処理を例にすると、「ユーザー情報の保存」「登録ログの保存」「ポイント付与」のように、複数のテーブルに対して更新が発生することがあります。どれか一つでも失敗したのに他だけが反映されてしまうと、データベースの整合性が崩れてしまいます。

Springでは、このような複数の処理をまとめて扱うトランザクション管理を、自分で細かく制御する必要はありません。@Transactionalアノテーションをメソッドに付けるだけで、トランザクションの開始・コミット・ロールバックを自動的に行ってくれるようになります。つまり「このメソッドの中身は全部ひとまとまりで処理してね」とSpringに伝える印のようなものです。

イメージしやすいように、簡単なサンプルを見てみましょう。


@Transactional
public void registerUserAndHistory() {
    // ユーザー情報を保存する処理
    // 登録履歴を保存する処理
    // どこかでエラーが起きたら、このメソッド内の変更はまとめて取り消される
}

このように、@Transactionalを付けたメソッドの中で行われるデータベース更新は、「全部成功したらコミット」「途中で失敗したらロールバック」という形でまとめて扱われます。たとえば、ユーザー登録時にユーザー情報と履歴を同時に保存する処理や、ECサイトで注文情報と在庫情報を同時に更新する処理など、「一部だけ反映されてしまうと困る処理」を安全にまとめるのがトランザクション管理の基本的な役割です。

2. @Transactionalの基本的な使い方

2. @Transactionalの基本的な使い方
2. @Transactionalの基本的な使い方

まずは基本の書き方を見てみましょう。@Transactionalをメソッドやクラスに付けるだけで、トランザクションが自動的に開始・コミット・ロールバックされます。


@Service
public class UserService {

    @Transactional
    public void registerUser(User user) {
        userRepository.save(user);
        logRepository.save(new Log("ユーザー登録"));
    }
}

この例では、ユーザーとログの登録が両方成功した場合のみ、データベースに反映されます。どちらかで例外が発生したら、自動的にロールバックされるのが特徴です。

3. トランザクションの伝播(propagation)の種類と意味

3. トランザクションの伝播(propagation)の種類と意味
3. トランザクションの伝播(propagation)の種類と意味

@Transactionalには、propagation(伝播)という設定があります。これは「すでにトランザクションが存在している場合に、どう振る舞うか」を指定します。

代表的な伝播タイプ:

  • REQUIRED(デフォルト):既存のトランザクションがあれば参加、なければ新規作成
  • REQUIRES_NEW:常に新しいトランザクションを開始(既存は一時中断)
  • MANDATORY:既存トランザクションがないと例外
  • NEVER:トランザクションがあると例外
  • NESTED:ネストされたトランザクション(JDBCやDBによる)

たとえばログだけ別トランザクションにしたいときにはREQUIRES_NEWを使います。


@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveLog(Log log) {
    logRepository.save(log);
}

4. 分離レベル(isolation)の基本と使いどころ

4. 分離レベル(isolation)の基本と使いどころ
4. 分離レベル(isolation)の基本と使いどころ

分離レベルは、同時に実行されるトランザクション同士のデータの見え方を制御します。具体的には、読み取り時に他のトランザクションの未確定データを見えるようにするかどうかです。

Springの@Transactionalでは、以下の分離レベルが指定できます:

  • DEFAULT:データベースのデフォルト設定に従う
  • READ_UNCOMMITTED:未コミットデータも見える(ダーティリード)
  • READ_COMMITTED:コミット済みのデータのみ(一般的)
  • REPEATABLE_READ:同一トランザクション内では同じ結果が保証される
  • SERIALIZABLE:完全に直列化、最も安全だが最も重い

@Transactional(isolation = Isolation.READ_COMMITTED)
public void readData() {
    // 安全な読み取り処理
}

基本的にはREAD_COMMITTEDREPEATABLE_READが使われます。

5. タイムアウト(timeout)の設定と注意点

5. タイムアウト(timeout)の設定と注意点
5. タイムアウト(timeout)の設定と注意点

トランザクションが長時間ロックを保持しないように制限できるのがtimeout設定です。秒数で指定し、指定時間内に処理が終わらないとTransactionTimedOutExceptionがスローされます。


@Transactional(timeout = 5)
public void longProcess() {
    // 5秒以内に完了しないと例外
}

タイムアウトを設定することで、ロック待ちによる遅延や、パフォーマンス劣化を防ぐことができます。

6. rollbackFor属性による例外制御

6. rollbackFor属性による例外制御
6. rollbackFor属性による例外制御

@Transactionalでは、どの例外が発生したときにロールバックするかも指定できます。通常はRuntimeException系でロールバックされますが、それ以外の例外でもロールバックしたい場合はrollbackForを使います。


@Transactional(rollbackFor = { IOException.class, SQLException.class })
public void riskyMethod() throws IOException {
    // 例外発生時にロールバック
}

逆に、ロールバックさせたくない例外がある場合はnoRollbackForも指定できます。

7. トランザクションの確認とログの出力方法

7. トランザクションの確認とログの出力方法
7. トランザクションの確認とログの出力方法

Springでは、トランザクションの開始・コミット・ロールバックのタイミングをログで確認できます。設定ファイルでログレベルをDEBUGにすると、詳細な情報が出力されます。


logging.level.org.springframework.transaction=DEBUG

これにより、思った通りにトランザクションが制御されているかを確認できます。特に分離レベルや伝播に関するバグを追うときに有効です。

まとめ

まとめ
まとめ

ここまでSpringの@Transactionalについて、基礎から伝播や分離レベル、タイムアウトの考え方まで一通り見てきました。実際に開発をしていると、データベースの整合性を守りながら処理を進めたい場面は想像以上に多く、トランザクションの仕組みを理解しておくことで安定したアプリケーションを作りやすくなります。特に初心者のうちは例外が起きるとデータがどうなるのか不安になることがありますが、@Transactionalを正しく設定すれば安全に実行でき、必要に応じて自動でロールバックも行われます。難しそうに感じる分離レベルや伝播の設定も、それぞれの特徴を知っていれば実用面で迷いにくく、実際に使う場面が来たときに落ち着いて判断できます。

また、伝播タイプでは既存のトランザクションをどう扱うかを細かく決められるため、複数の処理が複雑に絡むアプリケーションやログの保存を別扱いにしたいケースなどでも柔軟に対応できます。分離レベルはデータの読み取り方を制御でき、同時に複数の処理が動く環境でも安定した結果を得られます。こうした仕組みを理解しておくと、誤ったデータで処理が進むリスクを防げるだけでなく、予期せぬバグを早い段階で見つける助けにもなります。タイムアウトの設定やrollbackForも、問題が起きたときの振る舞いを細かく調整できるため、より細やかなアプリケーション制御に役立ちます。

実際にコードを書くときには、メソッドの上にアノテーションを付けるだけなのでとても簡単に見えますが、その裏ではさまざまな制御が働いています。だからこそ、なんとなく使うのではなく、今回学んだ知識を少しずつ試しながら理解を深めていくことが大切です。特にSpringはアプリケーションの規模が大きくなるほどトランザクションの重要性が増していくので、初心者の段階で基本をしっかり押さえておくと後がとても楽になります。自分の書いた処理がどんな順番で実行され、どんなときにロールバックされるのかを確認しながら進めると、理解も早くなります。

簡単なサンプルで振り返る


@Service
public class SampleService {

    @Transactional
    public void execute() {
        mainRepository.save(new Data("保存"));
        subRepository.save(new Log("ログ記録"));
    }
}
    

このような短いコードでも、内部では「成功ならコミット、失敗ならロールバック」という流れが自動で働きます。特別な設定がなくても扱えるため、初めて触れる方でも安心して使い始めることができます。慣れてきたら伝播や分離レベルも少しずつ試してみると、より柔軟な処理の書き方が見えてきます。

先生と生徒の振り返り会話

生徒

「最初はトランザクションって難しそうだと思っていましたけど、アノテーションだけで多くのことが任せられるんですね!」

先生

「そうなんです。仕組みを知っておくと安心して使えますし、アプリケーションが大きくなるほど役立つ知識になりますよ。」

生徒

「伝播とか分離レベルも、名前が難しいだけで考え方は整理すれば理解できますね。」

先生

「ええ。今回の内容を覚えておくと、実際にコードを書くときにも役立ちます。少しずつ試しながら慣れていきましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Springの@Transactionalアノテーションとは何ですか?どんな役割があるのか教えてください

@Transactionalアノテーションは、Springでトランザクション管理を簡単に行うための仕組みです。データベース操作を安全に実行し、エラーが発生したときには自動的にロールバックして、データの整合性を保ってくれます。

Springの学習を効率化したい方へ

この記事の内容をもっと深く知るには、以下の入門書が最適です。

Spring Framework超入門をAmazonで見る
カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「StartingWith」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Spring
SpringDataJPAのJPAクエリメソッド「NotLike」の使い方を完全ガイド!初心者向け解説
更新記事
New4
Spring
SpringDataJPAのJPAクエリメソッド「Like」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Java
JavaのBooleanクラスの使い方を完全ガイド!初心者でもわかる真偽値の操作
No.3
Java&Spring記事人気No3
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.4
Java&Spring記事人気No4
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.5
Java&Spring記事人気No5
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.6
Java&Spring記事人気No6
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方
No.7
Java&Spring記事人気No7
Spring
SpringのModelクラスとaddAttributeメソッドの使い方を完全ガイド!初心者でも安心
No.8
Java&Spring記事人気No8
Spring
SpringDataJPAのJPAクエリメソッド「EndingWith」の使い方を完全ガイド!初心者向け解説