質問: `@RequestScoped`を付けたクラスで、1回のHTTPリクエストの処理で (1) DBへ書き込む (2) RuntimeExceptionをthrowする をさせたところ、(1)の書き込み内容はDBのテーブルに書き込まれませんでした。 (2)によってロールバックされたかのような挙動ですが、`@RequestScoped`を付けただけで、そのようなトランザクション制御がされるのでしょうか? そうだとすると、`@Transactional`は何のためにあるのでしょうか?
回答: `@RequestScoped`がトランザクション制御をするか、という質問への回答としては、「しない」となります。 DBのテーブルに書き込まれなかった、という現象についてですが、RDBMSの設定にもよります。データソースまたはJDBCでのautoCommitの設定は何になっていますでしょうか。もし、autoCommitがfalseであれば、`@Transactional`をつけていないのにロールバックされたかのような挙動になります。`@Transactional`がないのでコミットするタイミングがなく、RDBMSによってロールバックされるからです。もしこのケースであれば、RuntimeExceptionをthrowしなくても、やはりコミットするタイミングがないのでロールバックされます。 `@RequestScoped`はWebの概念でのオブジェクトのスコープ、保存期間となりますので、RDBMSのトランザクションには関わらない概念です。