У меня есть приложение, которое использует удаленное взаимодействие. NET, которое выполняет некоторую работу с базой данных. Проблема в том, что транзакции ведут себя по-другому, когда компоненты развертываются удаленно, по сравнению с тем, когда они запускаются локально.
Сценарий выглядит следующим образом
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
bool performOffer = true;
if (objectState == ObjectStatus.OfferAnswer)
{
// Not executed in current scenario
[..]
}
if (performOffer)
{
// This is a remote component
ObjectState objObjectState = new ObjectState();
// Depublish the object to get a correct sequence of events.
objObjectState.Depublish(_dbConnectionString, _userGuid, objectId);
// Create the offer
objOI.ObjectOffer(_dbConnectionString, _userGuid, objectId, 1, dateAnswer.ToShortDateString());
objObjectState.Offer(_dbConnectionString, _userGuid, objectFunctionIdentity);
// Send emails and letters accordingly
autoPublishUtils.Offer(SMTPHost, useLanguage, defaultCulture, objectFunctionIdentity);
}
throw new Exception("Testing");
ts.Complete();
}
Функция Depublish(...)
содержит собственная транзакция, а при запуске с использованием локальных библиотек DLL эта транзакция откатывается правильно при возникновении исключения «Тестирование». При использовании удаленного взаимодействия. NET для удаленного вызова компонента внутренняя транзакция в Depublish(...)
не откатывается.
Я убедился, что MSDT C работает правильно, и DTCPing может подключаться в обоих направлениях. Я пробовал обновиться до. NET 4.8, но безуспешно. Я нашел эту статью, но симптомы на самом деле не совпадают, локальный Transaction.Current никогда не становится нулевым.
Я думаю, что сейчас моя главная проблема в том, что я действительно не понимаю, как это должно работать, так что теперь, когда это не работает, я не знаю, как развиваться. Любая поддержка будет оценена!