2011-09-27 3 views
3

Je suis confronté à un problème de délai d'attente de transaction MSDTC. Pour des raisons historiques, nous avons encore beaucoup de code hérité exécutant des opérations DB par C++ ODBC, et la connexion est escaladée dans MSDTC par défaut. Le problème est lorsque j'essaie d'effectuer une opération longue qui prend plus de 1 minute, la transaction sera automatiquement éliminée par MSDTC, j'ai trouvé qu'il est possible de modifier cette valeur par l'outil d'administration Services de composants, Cependant, puis-je définir ce délai valeur par programme?Problème de délai d'attente de transaction MSDTC

Toute référence sera appréciée, merci d'avance.

Répondre

6

Je m'appelle Tony et je travaille avec l'équipe Distributed Transaction sur le site de Microsoft Support. J'ai lu votre message et je crois comprendre ce que vous demandez. Voici un exemple de code que j'ai écrit pour effectuer le changement au niveau du composant. J'espère que cela vous aide:

//Connect to the machine 
COMAdmin.COMAdminCatalog m_objAdmin1 = new COMAdmin.COMAdminCatalog(); 
m_objAdmin1.Connect(System.Environment.MachineName.ToString()); 

//Get a list of COM+ Applications 
COMAdmin.COMAdminCatalogCollection objApplications = (COMAdmin.COMAdminCatalogCollection)m_objAdmin1.GetCollection("Applications"); 
objApplications.Populate(); 
COMAdmin.COMAdminCatalogObject appToFind = null; 

//Find the application you want to change 
for (int i = 0; i < objApplications.Count; i++) 
{ 
    appToFind = (COMAdmin.COMAdminCatalogObject)objApplications.get_Item(i); 

    if (appToFind.Name.ToString() == "MSTEST") 
    { 
     break; 
    } 
} 


//Now find the component in the application you wish to change 
COMAdmin.COMAdminCatalogCollection objComponents = (COMAdmin.COMAdminCatalogCollection)objApplications.GetCollection("Components", appToFind.Key); 
objComponents.Populate(); 
COMAdmin.COMAdminCatalogObject ComponentsToFind = null; 

for (int i = 0; i < objComponents.Count; i++) 
{ 
    ComponentsToFind = (COMAdmin.COMAdminCatalogObject)objComponents.get_Item(i); 

    if (ComponentsToFind.Name.ToString() == "tdevere_vb6_com.Tdevere") 
    { 
     break; 
    } 
} 

//Set the Transaction support option 
//Enable the overide option 
//Set the new value for the time out option 
COMAdmin.COMAdminTransactionOptions temp = (COMAdmin.COMAdminTransactionOptions)ComponentsToFind.get_Value("Transaction"); 
ComponentsToFind.set_Value("Transaction", COMAdmin.COMAdminTransactionOptions.COMAdminTransactionRequiresNew); 
ComponentsToFind.set_Value("ComponentTransactionTimeout", 120); 
ComponentsToFind.set_Value("ComponentTransactionTimeoutEnabled", true); 

//Make sure to save the changes 
objComponents.SaveChanges(); 
objApplications.SaveChanges(); 
Questions connexes