WebSphere「バージョン固有の」setRollbackOnly 動作に合わせたアプリケーションの変更
このタスクを使用して、EJB 3.0 より後のアプリケーションが EJB 3.0 より前の動作をし、EJB 3.0 より前のアプリケーションが EJB 3.0 より後の動作をするようにできます。この処理動作を実現するこのタスクの手順は、「このタスクについて」セクションに説明されている非常に限定的な処理シナリオに基づいています。
このタスクについて
処理シナリオ: このタスクのベースとなる処理シナリオについて説明します。
グローバル・トランザクションを開始する EJB メソッドが呼び出されます。このメソッドの実行中に、別の EJB メソッドが呼び出され、同じトランザクション内で引き続き実行されます。このメソッドの実行中に setRollbackOnly() メソッドが呼び出されます。このシナリオ状況の発生時の EJB コンテナーの動作は、EJB 仕様により決定します。ただし、この動作は WebSphere® Application Server for EJB 3.0 サポートで変更される必要がありました。
EJB 仕様のこれまでのバージョンと同様に、資料「JSR 220: Enterprise JavaBeans™,Version 3.0 EJB Core Contracts and Requirements」のセクション 13.6.2.8 に、以下の内容が記載されています。
「(呼び出し元から継承されるトランザクションとは対照的に) ビジネス・メソッドをインスタンスにディスパッチする直前にコンテナーがトランザクションを開始した場合、コンテナーではこのインスタンスにより setRollbackOnly メソッドが呼び出されたことを認識する必要があります。ビジネス・メソッド呼び出しが完了したら、コンテナーはトランザクションをコミットするのではなく、トランザクションをロールバックする必要があります。 ビジネス・メソッドが適切に戻るか、またはアプリケーション例外が発生した場合、コンテナーはロールバックの実行後にメソッド実行結果またはアプリケーション例外をクライアントに渡す必要があります。」また、セクション 14.3.11 には次のような記述があります。「ただし、インスタンスによりその EJBContext オブジェクトに対して setRollbackOnly メソッドが呼び出されたためにコンテナーがトランザクションのロールバックを実行した場合は、コンテナーは javax.ejb.EJBException または java.rmi.RemoteException をスローしてはなりません。この場合、コンテナーはトランザクションをロールバックしてビジネス・メソッド結果またはビジネス・メソッドによりスローされたアプリケーション例外をクライアントに渡す必要があります。」
従来より、WebSphere Application Server では、仕様の上記のセクションを、setRollbackOnly の動作はトランザクションがそのトランザクションを開始したメソッド内で RollbackOnly としてマークされた場合にのみ適用される、という意味と解釈していました。ところが、EJB 3.0 仕様向けの Compatibility Test Suite によれば、RollbackOnly とマークされたトランザクションは上記の setRollbackOnly 動作を示す必要があり、このことは、トランザクションがそのトランザクションを開始したメソッド内で RollbackOnly とマークされたか、元の EJB メソッドから呼び出されたのと同じトランザクション内の別のメソッド内で RollbackOnly とマークされたかに関係はない、となっています。
- アプリケーションが、Container Managed Transaction サポート TX_REQUIRED が指定されている EJB A に対してメソッド art を呼び出します。
- コンテナーはトランザクションを開始し、このメソッドを呼び出します。
- メソッド A.art() が、Container Managed Transaction サポート TX_REQUIRED が指定されている EJB B に対してメソッド bob を呼び出します。
- B.bob() 内で、トランザクションに対して setRollbackOnly メソッドが呼び出され、完了します。
EJB 3.0 より前の動作: トランザクションは B.bob() メソッドで開始されないため、TranactionRolledbackException が A.art() および最終的にクライアント・アプリケーションにスローされます。
EJB 3.0 より後の動作: メソッド B.bob() は通常の方法でメソッド A.art() に戻ります。メソッド A.art() がトランザクションのロールバックを実行し、その結果をクライアントに戻します。このとき、EJB 仕様に示されているようにクライアント・アプリケーションに例外が戻されることはありません。
- com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor: このプロパティーにより、ユーザーは、EJB 3.0 モジュール内の EJB がこのセクションで前述した EJB 3.0 より前の setRollbackOnly 動作を示すようにしたいアプリケーションの名前を指定することができます。
- com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor: このプロパティーにより、 ユーザーは、EJB 3.0 より前のモジュール内の EJB がこのセクションで前述した EJB 3.0 の setRollbackOnly 動作を示すようにしたいアプリケーションの名前を指定することができます。