トランザクションの自動ロールバックをテストしたいと思います。したがって、システム例外をスローする単純なbean [src]を実装しました。これにより、自動的にロールバック[1]が発生します。また、インターフェースSessionSynchronizationを実装したので、 afterCompletionメソッドを使用してロールバックに影響を与えることができます。しかし、この方法の議論は真実であり、仕様に関しては誤りであると私は予想しています[2]。
何かが足りないのですか、それともこれはJBoss 7のバグですか?バグトラッカーを検索しましたが、何も見つかりませんでした...間違った単語を使用した可能性がありますか?
これがバグではない場合:システムまたはアプリケーションの例外が発生した場合にafterCompletionパラメーターをfalseに設定することに関する設定はありますか?
[1]:「コンテナ管理のトランザクションをロールバックする方法は2つあります。1つは、システム例外がスローされた場合、コンテナは自動的にトランザクションをロールバックします。2つ目は、EJBContextインターフェースのsetRollbackOnlyメソッドを呼び出すことです。メソッドは、トランザクションをロールバックするようにコンテナに指示します。Beanがアプリケーション例外をスローした場合、ロールバックは自動ではありませんが、setRollbackOnlyの呼び出しによって開始できます。」 http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html
[2]:「afterCompletionメソッドはステートフルセッションBeanインスタンスにトランザクションコミットプロトコルが完了したことを通知し、トランザクションがコミットされたかロールバックされたかをインスタンスに通知します。」 http://docs.oracle.com/javaee/6/api/javax/ejb/SessionSynchronization.html
[src]:
@Stateful
@LocalBean
public class RollbackTestBean implements RollbackTest, SessionSynchronization {
int counter = 0;
int counterBuffer = 0;
private final Logger logger = Logger.getLogger(this.getClass().getName());
@Override
public int getCounter() {
return counter;
}
@Override
public void throwSystemException() throws SystemException {
counter++;
throw new SystemException();
}
@Override
public void afterBegin() throws EJBException, RemoteException {
logger.info("[TX]: after begin");
counterBuffer = counter;
}
@Override
public void afterCompletion(boolean success) throws EJBException, RemoteException {
logger.info("[TX]: after completion: " + success);
if (!success)
counter = counterBuffer;
}
@Override
public void beforeCompletion() throws EJBException, RemoteException {
logger.info("[TX]: before completion");
}
}