① ロールバックするタイミングは「非検査例外が発生したときのみ」
→ rollbackForプロパティで指定した検査例外はロールバック対象とすることができる
@Transactional(rollbackFor=Exception.class)
② @Transactionalはpublicメソッドにつけた時のみロールバック有効
③ @Transactionalを付けたpublicメソッドは別クラスからの呼び出し時のみロールバック有効
④ 外部トランザクションが開始している場合はそのトランザクションを利用する
→ propagationプロパティで制御。デフォルト値(PROPAGATION_REQUIRED)が外部トランザクションをそのまま利用する設定となっている
⑤ @Transactionalをつけなかった場合、トランザクションは発生しない?
前提
・Spring Data JPAを利用している
・RepositoryクラスはCrudRepositoryインタフェースを継承している(↓みたいに)
@Repository
public interface HogeRepository extends CrudRepository<HogeEntity, String>
結論
・トランザクションは「Repositoryクラスのメソッド」に対して適用される。
詳しく
・CrudRepositoryインタフェースのデフォルト実装は「SimpleJpaRepositoryクラス」であり、このSimpleJpaRepositoryクラスのCRUDメソッド(save/update/find/delete等)に@Transactinalがついている
※SimpleJpaRepositoryの公式ドキュメント
https://spring.pleiades.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html
CrudRepository インターフェースのデフォルト実装。これにより、プレーンな EntityManager よりも洗練されたインターフェースが提供されます。
参考