以下に、トランザクション管理種別を指定した場合の制御例を示します。
トランザクション管理種別に“Bean”を指定した場合の制御例
図の説明
Session Bean1は、UserTransaction.begin()メソッドを発行し、トランザクションを開始します。
Session Bean1は、Entity Bean1を呼び出します。
Entity Bean1がDBに対して処理を行います。
Session Bean1は、Entity Bean2を呼び出します。
Entity Bean2がDBに対して処理を行います。
Session Bean1は、UserTransaction.commit()メソッドを発行し、トランザクションをコミットします。このときコンテナは、高速に呼び出されるBeanがアクセスしたDBに対してコミットを発行します。
トランザクション管理種別に“Container”を指定した場合の制御例
トランザクション管理種別に“Container”を指定した場合、トランザクション属性によって、制御方法は異なります。
以下に、各トランザクション属性を指定した場合の制御例を示します。
Supportsは、推奨されない属性であるため省略します。
呼出し元で開始されたトランザクションで動作させるEJBアプリケーション(メソッド)に指定します。この属性を使用し、呼出し元でトランザクションが開始されていない状態でEJBアプリケーション(メソッド)が呼び出された場合、例外が発生します。
呼出し元でのトランザクションの動作の状態に影響をうけることなく、常にトランザクションが開始されている状態で処理を行うことができます。
Message-driven Beanで“Required”を指定した場合の制御例は、“Message-driven Beanで“Required”を指定した場合の制御例”を参照してください。
JMSからメッセージを受信して、受信したメッセージの情報をDBに格納する場合の制御例を示します。受信したメッセージとDBアクセスを同一トランザクション内で処理するため、Message-driven Beanのトランザクション種別は“Container”、トランザクション属性には“Required”を指定します。
呼出し元で開始されたトランザクションと異なるトランザクションで実行することができます。このため、呼出し元のトランザクション処理とは異なるトランザクション処理を行うことができます。
呼出し元でのトランザクションの動作の状態に影響されることなく処理が行えます。EJBサービスが提供するトランザクション機能を使用しない場合に指定します。
呼出し元のトランザクションから影響をうけることなく処理が行えるため、EJBサービスが提供するトランザクション機能を使用しない場合に指定します。この属性を使用すると、呼出し元でトランザクションが開始された状態で呼び出されることを防ぐことができます(呼び出された場合は、例外が発生します)。