2017-11-05 9 views
0

.net 응용 프로그램 용 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(); 

왜 그런가요? 이 주제에 대한 설명서를 찾을 수 없습니다. 필자가 발견 한 IBM 문서는 "연결은 여러 트랜잭션에 참여할 수 있지만 언제든지 하나의 트랜잭션 만 활성화됩니다." 하지만 연결을 언제 어떻게 열지는 모르겠다. DB 연결과 같을 것으로 예상됩니다.이 트랜잭션은 트랜잭션 범위 내에서만 열려 있지만, MQmanager 연결은 트랜잭션 범위 내에서 열린 경우에만 모든 트랜잭션에 참여합니다.

누구든지 나에게 설명 할 수 있습니까?

답변

0

이 영역에는 몇 개의 APAR이 있습니다. APAR IT16143은 MQ와 함께 제공된 MQ.NET XA 샘플의 변경 사항을 도입했으며 다른 APAR는 IT16606입니다. XA 사양에 따라 연결은 한 번에 하나의 활성 트랜잭션에만 참여할 수 있습니다. MQRC_GLOBAL_UOW_CONFLICT 은 다른 작업 단위 (UOW) 내에서 연결이 사용되는 경우 연결에 대한 이전 트랜잭션이 여전히 활성 인 경우보고됩니다 ( ). 이 오류를 방지하려면 트랜잭션 단위가 동일한 연결 핸들 을 동시에 공유하지 않도록 응용 프로그램을 디자인해야합니다. 다음 링크는 트랜잭션에 대해 자세히 설명합니다. https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q029290_.htm