29621


`@RequestScoped`を付けたクラスで、1回のHTTPリクエストの処理で  
(1) DBへ書き込む  
(2) RuntimeExceptionをthrowする  
をさせたところ、(1)の書き込み内容はDBのテーブルに書き込まれませんでした。  
(2)によってロールバックされたかのような挙動ですが、`@RequestScoped`を付けただけで、そのようなトランザクション制御がされるのでしょうか？  
そうだとすると、`@Transactional`は何のためにあるのでしょうか？


CC BY-SA 3.0
2016-09-29T14:08:34.103
29248
2016-10-17T05:13:52.007
8078
question
java java-ee
@RequestScopedはトランザクション制御をするか？


`@Transactional`で設定したトランザクションは、`RuntimeException`を throw すると、rollback されます。  
（デフォルトの動作）

`@RequestScoped`は関係ないですね・・・。


CC BY-SA 3.0
2016-10-06T08:55:52.143
29389
2016-10-06T08:55:52.143
13291
29248
answer


`@RequestScoped`がトランザクション制御をするか、という質問への回答としては、「しない」となります。

DBのテーブルに書き込まれなかった、という現象についてですが、RDBMSの設定にもよります。データソースまたはJDBCでのautoCommitの設定は何になっていますでしょうか。もし、autoCommitがfalseであれば、`@Transactional`をつけていないのにロールバックされたかのような挙動になります。`@Transactional`がないのでコミットするタイミングがなく、RDBMSによってロールバックされるからです。もしこのケースであれば、RuntimeExceptionをthrowしなくても、やはりコミットするタイミングがないのでロールバックされます。

`@RequestScoped`はWebの概念でのオブジェクトのスコープ、保存期間となりますので、RDBMSのトランザクションには関わらない概念です。


CC BY-SA 3.0
2016-10-17T05:13:52.007
29621
2016-10-17T05:13:52.007
4464
29248
answer