EnterpriseJavaBeansのコンテナ管理トランザクション属性を参照しています。「Mandatory」と「Never」を使用することが理にかなっているユースケースは考えられません。誰かがこれらのトランザクション属性を使用するのに必要なケースを説明できますか?
4 に答える
私は最近、すべてのトランザクションがアプリケーション層 (サービス クラス) でマークアウトされ、データ アクセス オブジェクトを直接呼び出してはならないことを主張するプロジェクトに取り組みました。
これは、関連付けられたアプリケーション ロジックが呼び出されない限り、データベースに書き込まれないようにするためでした (通常、データベース操作は、キューに送信されるメッセージとペアになっていました)。
すべての DAO EJB に MANDATORY を適用することで、それらがトランザクションで実行される間、トランザクションを開始するのは呼び出し側の仕事であることが保証されました。DAO はサービス クラス (デフォルトは REQUIRED) によって呼び出されたため、DAO は正常に機能しましたが、誤って直接呼び出した場合は例外が発生しました。
例外をスローすることにより、クライアントがトランザクションスコープ内で実行されていないという事実を明示的に通知したい場合は、MandatoryとNeverを使用します。
必須はTransactionRequiredExceptionをスローしますが、RemoteExceptionはスローしません。
たとえば、クライアントがトランザクションの内部/外部で実行され、エンタープライズBeanのメソッドを呼び出し、トランザクションの内部/外部でも実行される場合、 SUPPORTSの例外はスローされません。ただし、MANDATORYを使用した場合、外部の場合、TransactionRequiredExceptionがスローされます。
必須属性が役立つ場合があります。
私は Bean を持っています。これは多くのアプリケーションから呼び出されます。呼び出し元のアプリケーションに応じて、呼び出し元のトランザクションに参加するか、新しいトランザクションで実行する可能性が必要です。そのため、2 つの Bean が定義されています。1 つは RequiresNew で、もう 1 つは Required です。2 つ目は、Mandatory を使用して呼び出しトランザクションが存在することを確認できますが、必須ではありません。