私は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接続はトランザクションスコープ内で開かれた場合にのみ、トランザクションに参加します。
誰でもこのことを私に説明できますか?