2017-11-05 8 views
0

私はMQアプリケーションのMQ APIを使用してMQClient 7.5.0.5を使用しています。MQマネージャ接続がトランザクションスコープに参加していません

トランザクションスコープにないWMQ.MQQueueManagerを使用してMQManager接続を開くと、 後で開くトランザクションには接続が参加しません。 ただし、接続がトランザクションスコープ内で実行された場合、接続は他のトランザクションスコープに後で参加します(接続が最初に開いたトランザクションスコープとは無関係)。 さらに説明する:

を私はDoWork方法があります。コードは次のようである場合には、接続はトランザクションに参加しません

void DoWork(MQManager mqManager) 
{ 
    //Write to DB 
    ...... 
    queue = mqManager.AccessQueue(queueName, MQOO_OUTPUT) 

    MQPutMessageOptions op = new MQPutMessageOptions(); 
    op.options = MQPMO_SYNCPOINT; 
    queue.Put(msg, options); 
    queue.Close(); 
} 

を:

mqManager = new MQManager("MgName","ChName","Srv(port)"); 
using(scope = new transaction scope) 
{ 
    DoWork(mqManager) 
    scope.complete(); 
} 
mqManager.dossconnect(); 

コードは次のようです接続は、両方のトランザクションに参加します。

MQManager mqManager = null; 
using(scope1 = new transaction scope) 
{ 
    mqManager = new MQManager("MgName","ChName","Srv(port)"); 
    scope.complete() 
} 
using(scope = new transaction scope) 
{ 
    DoWork(mqManager); 
    scope.complete(); 
} 
mqManager.dossconnect(); 

それはなぜですか? この件に関するドキュメントが見つかりません。 私が見つけたのは、「接続はいくつかのトランザクションに参加するかもしれないが、ある時点では1つのトランザクションだけがアクティブになっている」というIBMの文書でした。 しかし、いつ、どのようにして接続を開くかについては何もしていません。 DB接続のようなものですが、トランザクションスコープ内でのみ開かれていますが、MQmanager接続はトランザクションスコープ内で開かれた場合にのみ、トランザクションに参加します。

誰でもこのことを私に説明できますか?

答えて

0

この領域には、いくつかのAPARがありました。 APAR IT16143は、MQとともに出荷されたMQ.NET XAサンプルの変更を導入しました。もう1つのAPARはIT16606です。 XA仕様によれば、接続は特定の時間に1つの アクティブトランザクションにのみ参加できます。 MQRC_GLOBAL_UOW_CONFLICT のエラーは、その接続が別の作業単位内で使用されている場合に、接続の以前のトランザクションがまだアクティブである場合に報告されます。 このエラーを回避するには、トランザクションユニットが同じ接続ハンドル を同時に共有しないようにアプリケーションを設計する必要があります。フォローリンクはトランザクションについて詳しく説明しています。 https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q029290_.htm

関連する問題