Тайм-аут транзакции MSDTC - PullRequest
       16

Тайм-аут транзакции MSDTC

3 голосов
/ 27 сентября 2011

Я столкнулся с проблемой истечения времени ожидания транзакции MSDTC. По историческим причинам у нас все еще есть много унаследованного кода, выполняющего операции DB с помощью ODBC C ++, и по умолчанию соединение преобразуется в MSDTC. Проблема в том, что когда я пытаюсь выполнить длительную операцию, которая занимает более 1 минуты, MSDTC автоматически удалит транзакцию, я обнаружил, что можно изменить это значение с помощью инструмента администрирования служб компонентов, Однако можно ли установить это значение времени ожидания программно?

Любая ссылка будет оценена, спасибо заранее.

1 Ответ

6 голосов
/ 04 октября 2011

Меня зовут Тони, и я работаю с командой распределенных транзакций здесь, в службе поддержки 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();
...