問題タブ [bean-managed-transactions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
transactions - Bean 管理の MDB およびデータベースの例外
データベース操作を実行する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 に再配信されます。
私の質問が明確でない場合はお知らせください。
java - 2 つの BMT ejbs 1 つの TX = 不可能?
手短に言えば、このトピックへのリンク: 最初の EJB が 2 番目の EJB のメソッドを呼び出し、すべてが最初の EJB から開始する単一でラップされるBean 管理のトランザクションの性質を持つ 2 つの EJB を持つことは可能ですか?UserTransaction
java - JPA/Hibernate:EntityManager.close()とIllegalStateException?
ロギングはJTAトランザクションから独立している必要があるため、 JEE環境内にロギングサービスを使用してTransactionManagementType.BEAN
いるため、自分でトランザクションを処理する必要があります。
現在、このロギング サービスは次のようになっています。
このサービスを使用するエンドポイントは次のとおりです。
レシピを追加すると、log メソッドが 2 回呼び出されます。データベースに2つのエントリがあるため、必要に応じて機能することを保証できますが、entityManager.close() メソッドのドキュメントを読むと:
アプリケーション管理のエンティティ マネージャーを閉じます。close メソッドが呼び出された後、EntityManager インスタンスのすべてのメソッドと、それから取得されたすべての Query および TypedQuery オブジェクトは、getProperties、getTransaction、および isOpen (false を返す) を除いて、IllegalStateException をスローします。エンティティ マネージャがアクティブなトランザクションに関連付けられているときにこのメソッドが呼び出された場合、永続化コンテキストはトランザクションが完了するまで管理されたままになります。
例外: IllegalStateException - エンティティ マネージャがコンテナ管理の場合
IllegalStateException
...同じ EntityManager を 2 回使用するため、これは実際には機能してスローされてはなりません。(最初に log が呼び出され、persist()
andclose()
が呼び出され、次に log が再度呼び出され、and が再度呼び出されますpersist()
) close()
。なぜそれが機能し、将来的に悪い驚きを起こさないように例外をスローしないのかを理解したい.
java - MQ Queue トランザクションが 2 フェーズ トランザクションでロールバックされない
Bean 管理トランザクションを持つ EJB タイマー (EJB 2.1) があります。
タイマー コードは、1 つのトランザクションで 2 つのリソースを処理するビジネス メソッドを呼び出します。1 つはデータベースで、もう 1 つは MQ キュー サーバーです。
使用するアプリケーション サーバーは Websphere Application Server 7 (WAS) です。2 つのリソース (データベースとキュー マネージャー) 間の整合性を確保するために、WAS で 2 フェーズ コミットをサポートするオプションを有効にしました。これは、データベース操作中に何らかの例外が発生した場合に、キューに投稿されたメッセージがデータベースのロールバックと共にロールバックされ、その逆も同様であることを保証するためです。
以下にフローを説明します。
Timer コードでタイムアウトが発生すると、DirectProcessor の startProcess() が呼び出されます。これがビジネス メソッドです。このメソッドには、同じクラスの createPostXMLMessage() へのメソッド呼び出しがある try ブロックがあります。これには、クラス PostMsg の別のメソッド postMessage() への呼び出しがあります。
問題は、createPostXMLMessage() メソッドでデータベース例外が発生した場合、データベース部分が正常にロールバックされても、以前に投稿されたメッセージがロールバックされないことです。助けてください。
ejb-jar.xml 内