JavaEEでトランザクションのリトライをしたい
JavaEE7で開発しています。
デッドロックが検出された場合、SQLTransactonRollbackException
がスローされることは分かっているのですが、これを捕まえてトランザクションをリトライする方法が分かりません。
トランザクション制御には、@Transactional
を使っています。
ただ、@Transactional
のついたクラス(またはメソッド)の中でロールバックされた場合、再びそのメソッドを呼ぶと、TransactionRequiredException
が発生してしまいます。
トランザクションの外側(呼び出し側)のコードのイメージは↓こんな感じです。
(リトライ回数の制御とか、かなり省いていますが)
@RequestScoped
public class SomeFacade {
@Inject
private SomeTran someTran;
public void run()
try {
this.someTran.execute();
} catch (SQLTransactonRollbackException ex) {
this.someTran.execute(); // -> TransactionRequiredException
}
}
}
SomeTran
クラスに@RequestScoped
と@Transactional
が付いています。
@RequestScoped
public class SomeTran {
@Transactional
public void execute() {
...
}
}
1回のリクエストで、トランザクションを2度実行することはできないのでしょうか?
(そんなことは無いと思いますが・・・)