2011-09-27 75 views
3

我现在正面临MSDTC事务超时问题。 由于历史原因,我们仍然有大量遗留代码通过C++ ODBC运行数据库操作,并且默认情况下连接升级为MSDTC。 问题是当我尝试执行耗时超过1分钟的冗长操作时,事务将由MSDTC自动处理,我发现可以通过组件服务管理工具 更改此值。但是,我可以设置此超时价值编程?MSDTC事务超时问题

任何参考将不胜感激,在此先感谢。

回答

6

我的名字是Tony和我在Microsoft支持部门的分布式事务团队工作。我已阅读你的文章,并相信我明白你的要求。以下是我编写的用于在组件级别进行更改的代码示例。我希望这可以帮助你:

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