Приложение COM+ VB6: ошибка RM_ENLIST_FAILED_TOO_MANY_ENLISTS

Я испытываю странное поведение с транзакцией, запущенной из приложения VB6 (Com+), это устаревшее приложение вызывает несколько запросов к DB2 и SQLServer внутри одной и той же транзакции.
Возвращенная ошибка:

[Microsoft][ODBC Driver Manager] Failed to enlist on calling object's transaction query=SELECT COUNT (*) as FOO FROM BAR
          FOR FETCH ONLY WITH UR SorgenteErr: Microsoft OLE DB Provider for ODBC Drivers
9:42:42 AM [2032]: Error: -2147467259

Обычно в журнале msdtc отображается список 2 менеджеров ресурсов, например:

pid=2440       ;tid=4636       ;time=10/08/2020-10:48:11.404   ;seq=535        ;eventid=RM_ENLISTED_IN_TRANSACTION               ;tx_guid=bed0e21a-c138-4ff0-a94e-3dd819694ef7     ;"TM Identifier='(null)                                            '" ;"resource manager #1002 enlisted as transaction enlistment #1. RM guid = '62f2ad11-5eab-45f9-89d6-53d7488cfb6e'"
pid=2440       ;tid=4636       ;time=10/08/2020-10:48:11.545   ;seq=536        ;eventid=RM_ENLISTED_IN_TRANSACTION               ;tx_guid=bed0e21a-c138-4ff0-a94e-3dd819694ef7     ;"TM Identifier='(null)                                            '" ;"resource manager #1003 enlisted as transaction enlistment #2. RM guid = 'bd440a1c-7334-4170-b1d5-a5c9e25eb1a0'"

В одном случае, когда количество запросов увеличивается из-за какой-то логики приложения, мы наблюдаем странное поведение;
обычно приложение работает как положено, но иногда менеджеры ресурсов начинают странно увеличиваться с 2 до >32, вызывая ошибку RM_ENLIST_FAILED_TOO_MANY_ENLISTS.

attempt to enlist the resource manager failed because the limit on number of maximum enlistments has been reached.

pid=2440       ;tid=4636       ;time=10/23/2020-10:48:17.810   ;seq=566        ;eventid=RM_ENLISTED_IN_TRANSACTION               ;tx_guid=bed0e21a-c138-4ff0-a94e-3dd819694ef7     ;"TM Identifier='(null)                                            '" ;"resource manager #1033 enlisted as transaction enlistment #32. RM guid = '5596fb4e-6c48-441c-af48-2d17adfb4ea0'"
pid=2440       ;tid=4636       ;time=10/23/2020-10:48:18.092   ;seq=567        ;eventid=RM_ENLIST_FAILED_TOO_MANY_ENLISTS        ;tx_guid=bed0e21a-c138-4ff0-a94e-3dd819694ef7     ;"TM Identifier='(null)                                            '" ;"attempt to enlist the resource manager failed because the limit on number of maximum enlistments has been reached. RM guid = 'e260c743-46b4-4f96-a343-1553bc7974eb'"

Насколько я знаю, диспетчер ресурсов должен оставаться по одному на базу данных при правильном поведении.
Знаете ли вы какую-либо причину, которая может вызвать такое неожиданное поведение, когда зачисляется слишком много диспетчеров ресурсов (каждый с другим guid)?

Важно отметить, что это поведение началось, когда мы перешли с 9.7 FP 9a на 11.1.4 FP5 драйвер Db2 на клиентских машинах и машинах с подключением DB2.


person systempuntoout    schedule 26.10.2020    source источник
comment
Проведите некоторые расследования. Посмотрите в диагностике как для SQL-Server, так и для Db2, а также в средстве просмотра событий рабочей станции, чтобы найти признаки неисправности. Где-то будет указание на неисправность. Ваш вопрос не о программировании. Ваш вопрос касается устранения неполадок, поэтому ваш вопрос не подходит для веб-сайта программирования.   -  person mao    schedule 28.10.2020
comment
(Устранение неполадок) В вашем отредактированном вопросе говорится, что поведение изменилось после обновления драйвера Db2 на клиентских рабочих станциях и компьютерах с Db2-connect-server. Но ваш вопрос показывает использование драйвера Microsoft (поставщик OLE DB для ODBC). Вы внимательно изучили диагностику клиента Db2? Вы внимательно изучили диагностику сервера Db2-connect и обратились за помощью к специалистам по поддержке сервера Db2? Вы отправили заявку в службу поддержки IBM?   -  person mao    schedule 05.11.2020
comment
Конечно, мы проверили все трассировки db2, но ничего не заметили. Мы открываем тикет в IBM, но я хотел бы спросить и здесь, на случай, если кто-то сталкивался с такой же проблемой. Я хотел бы добавить, что я открыл такой вопрос, семь лет назад. Да, это устранение неполадок, но это как отладка резиновой утки; вы медленно и постепенно добавляете детали к делу, сосредотачиваясь на проблеме, но также получая помощь и совет от опытных людей.   -  person systempuntoout    schedule 05.11.2020
comment
Текст вопроса предполагает, что проблема возникает при повышенной нагрузке (к Db2 отправляется больше запросов). Удалили ли вы версию драйвера Db2, вернувшись к предыдущей, просто для того, чтобы продемонстрировать, не вызывает ли повышенная нагрузка симптомы со старым драйвером? Поведение предполагает, что msdtc затем открывает несколько подключений к Db2, когда запросы к Db2, возможно, не выполняются так быстро, как ожидалось.   -  person mao    schedule 05.11.2020
comment
Откат к старой версии есть в нашем чек-листе, но это не так просто; мы пытались выполнить откат для другой проблемы, которая возникла у нас несколько недель назад, но удаление не удалось. Запросы очень быстро (порядка миллисекунд) читают журналы. Что я вижу из журнала, так это то, что нет корреляции 1: 1 между зачисленным диспетчером ресурсов и выполненным запросом, пока проблема не возникнет.   -  person systempuntoout    schedule 05.11.2020


Ответы (1)


Если вы обновили драйвер (установка на месте) с 9.7 до 11.1, попробуйте переустановить драйвер (удаление, новая установка, узлы каталога и базы данных, если необходимо, и ваши пользовательские конфигурации). Обновление с версии 9.7, вероятно, оставляет что-то неправильное в конфигурации, что может вызвать проблемы с транзакциями XA.

person MountainSinger    schedule 05.11.2020