データベース操作を実行するCMT - InvoiceManagerを呼び出す次の定義を持つBean 管理のMDB -InvoiceInquiryMessageBeanがあります。
MDB はBean 管理として明示的に言及されており、 onMessage() にはトランザクションNOT_SUPPORTEDがあります。したがって、この MDB はトランザクション境界なしで実行されます。
以下の InvoiceManager Beanには、トランザクション タイプまたはトランザクション属性が定義されていません。そのため、デフォルトではコンテナ管理の CMTであり、トランザクション タイプはデフォルトでREQUIREDです。このBean はデータベース操作を実行します。質問は
質問1
DB 操作の実行中にエラー/例外 (主キー違反、SQL サーバー エラー コード 1205 のような DB デッドロック) が発生した場合、DB トランザクションは失敗したと見なされます。この DB トランザクションの失敗は、呼び出し元の MDB に影響を与えますか?
この質問の理由は、データベースの例外中にメッセージが MDB に再配信されることがあるからです。MDB はコンテナ管理トランザクションに参加しないように定義されていますが、データベースの問題はデータベース トランザクションに関連しているため、メッセージが MDB に再配信されます。
私の質問が明確でない場合はお知らせください。
@TransactionManagement(TransactionManagementType.BEAN)
@MessageDriven(name = "NonPersistentInquiryMessageBean", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
public class InvoiceInquiryMessageBean implements MessageListener
{
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void onMessage(Message msg)
{
call a CMT Bean(CMT_DB_Bean) which performs database operations
}
}
CMT Bean
@Stateless
public class InvoiceManager implements InvoiceManager Local {
entityManager.update();
}