2017-11-05 3 views
0

Ich arbeite mit MQClient 7.5.0.5, mit MQ API für .net-Anwendung.MQ Manager Connection, die nicht am Transaktionsbereich teilnehmen

Wenn ich eine MQManager-Verbindung mit WMQ.MQQueueManager nicht in einem Transaktionsbereich öffnen, wird die Verbindung nicht an einer Transaktion teilnehmen, die ich später öffne. Wenn die Verbindung jedoch innerhalb eines Transaktionsbereichs hergestellt wird, nimmt die Verbindung später an anderen Transaktionsbereichen teil (unabhängig vom ersten Transaktionsbereich, in dem die Verbindung geöffnet wurde). erklären weiter:

Ich habe eine DoWork Methode:

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(); 
} 

Wenn der Code so ist, die Verbindung nicht in der Transaktion beteiligt ist:

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

Wenn der Code wie folgt ist , die Verbindung ist an beiden Transaktionen beteiligt: ​​

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(); 

Warum ist das so? Ich kann keine Dokumentation zu diesem Thema finden. Alles, was ich fand, war die IBM Dokumentation, die behauptete: "Eine Verbindung könnte an mehreren Transaktionen teilnehmen, aber nur eine Transaktion ist zu irgendeinem Zeitpunkt aktiv." Aber nichts darüber, wann oder wie die Verbindung zu öffnen ist. Ich würde erwarten, dass es wie eine DB-Verbindung ist, die nur an dem Transaktionsbereich beteiligt war, in dem es geöffnet ist, aber hier ist die MQmanager-Verbindung nur dann an einer Transaktion beteiligt, wenn sie innerhalb eines Transaktionsbereichs geöffnet wurde ....

Kann mir das jemand erklären?

Antwort

0

In diesem Bereich gab es einige APARs. APAR IT16143 führte Änderungen in den MQ.NET XA-Beispielen ein, die mit MQ ausgeliefert wurden. Und das andere APAR ist IT16606. Gemäß der XA-Spezifikation kann eine Verbindung nur zu einer bestimmten Zeit an einer aktiven Transaktion teilnehmen. Der Fehler MQRC_GLOBAL_UOW_CONFLICT wird gemeldet, wenn eine vorherige Transaktion für eine Verbindung noch aktiv ist , wenn die Verbindung innerhalb einer anderen Arbeitseinheit verwendet wird. Um diesen Fehler zu verhindern, sollte die Anwendung so konzipiert sein, dass 2 Transaktionseinheit nicht die gleiche Verbindung behandeln gleichzeitig. Folgender Link spricht mehr über Transaktionen. https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q029290_.htm

Verwandte Themen