Распределенная транзакция завершается. Или включите в список эту сессию в новую транзакцию или ПУСТУЮ транзакцию

Просто любопытный, если кто-либо еще имеет эту конкретную ошибку и знает, как решить ее?

Сценарий следующие...

У нас есть Библиотека Предприятия использования веб-приложения ASP.NET, работающая на Windows Server 2008 ферма IIS, соединяющаяся с SQL Server кластерный бэкэнд 2008 года. MSDTC включен. Соединения с БД объединены.

Мое подозрение - то, что где-нибудь вдоль строки существует неудавшаяся транзакция MSDTC, соединение было возвращено к пулу, и следующий запрос на другой странице берет неправильно себя ведущее соединение и получил эту конкретную ошибку. Забавная вещь, мы получили эту ошибку на запросе, который не имеет никакой потребности вообще с распределенной транзакцией (соглашающийся на две базы данных, и т.д.). Мы только делали запрос Select (никакая транзакция), когда мы получили ошибку.

Мы сделали Профилирование SQL, и запрос добрался, работал на SQL Server, но никогда не возвращался (так как транзакция MSDTC была уже прервана в соединении).

Некоторые другие связанные ошибки сопровождать это:

  • Новому запросу не позволяют запуститься, потому что он должен идти с допустимым дескриптором транзакции.
  • Внутренняя ошибка.Net Framework Data Provider 60.
23
задан Daniel Allen Langdon 22 July 2010 в 20:54
поделиться

3 ответа

Награда может помочь получить ответ, который вы ищете, но вы, вероятно, получите более точные ответы, если дадите несколько примеров кода и лучше опишите, когда возникает ошибка.

Ошибка возникает только периодически? Это похоже на ваше описание.

Включаете ли вы закрытие, которое хотите выполнить, как транзакцию в блок с использованием TransactionScope , как рекомендует Microsoft? Это должно помочь избежать странного поведения транзакции. Напомним, что блок using гарантирует, что объект всегда удаляется независимо от созданных исключений. См. Здесь: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Если вы используете TransactionScope , есть аргумент System.TransactionScopeOption .RequiresNew , который сообщает платформе всегда создавать новую транзакцию для этого блока кода:

  Использование ts как новых транзакций.TransactionScope (Transactions.TransactionScopeOption.RequiresNew)
 'Делай что-нибудь
Конец использования

Кроме того, если вы подозреваете, что в соединении произошел сбой, а затем он был помещен обратно в пул соединений, наиболее вероятным решением будет заключить код, который может вызвать сбой соединения, в блоке Try-Catch и Dispose соединение в блоке захвата.

3
ответ дан 29 November 2019 в 03:11
поделиться

Я видел это раньше, и причина была именно в том, что вы думали. Как предложила Райс, убедитесь, что вы правильно удаляете объекты, связанные с db, чтобы избежать этой проблемы.

0
ответ дан 29 November 2019 в 03:11
поделиться

MSDTC по умолчанию имеет тайм-аут 90 секунд, если один запрос превышает этот временной лимит, вы столкнетесь с этой ошибкой, когда транзакция попытается зафиксировать.

4
ответ дан 29 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: