注意点は以下です。
◆メソッドに@Transactionを付与する場合、publicメソッドである必要がある
これはあまりやらない間違いですが、protectedやprivateメソッドに@Transactionを付与しても機能しません。
◆publicメソッドであっても、同一クラスの別メソッドからの呼び出しではない必要がある
@TransactionがついてないメソッドAから、ついているメソッドBを呼び出してるようなケースで、メソッドA,Bが同一クラスである場合には@Transactionが機能しません。
◆ロールバックするのは、非チェック例外が当該メソッドからスローされた時
チェック例外がスローされた場合はロールバックされません。
なので、チェック例外がスローされた時にもロールバックさせるには、キャッチ後にチェック例外を再スローするか、@Transactional(rollbackFor=Exception.class)のようにしてチェック例外でもロールバックするようにします。
チェック例外の再スローとrollbackFor、どちらもメリット/デメリットがあるかと思いますが、どちらにするのかプロジェクトで統一したほうがいいかと思います。
また、メソッドからスローされた時なので、メソッド内部でキャッチしている場合、再スローしないとロールバックしません。
◆@PostConstructやSpring Bootのスケジューラからの呼び出しでは機能しない
これ最近知りましたが、@PostConstructやSpring Bootのスケジューラからの呼び出されるメソッドに@Transactionがついていても機能しません。
@PostConstructやSpring Bootのスケジューラからの実行でトランザクション制御を行うには、@PostConstructやSpring Bootのスケジューラから呼び出されるクラス/メソッドと、トランザクション制御下で処理を行うクラス/メソッドを分ける必要があります。