Сведения о вопросе

krutoi

06:03, 18th August, 2020

Теги

.net   database   transactions   com+    

Можно ли совместно использовать транзакцию между приложением .Net и объектом COM+?

Просмотров: 441   Ответов: 2

Некоторое время назад я провел несколько тестов и так и не понял, как это сделать.

Ингредиент:

  • COM + транзакционный объект (разработан в VB6)
  • .Net веб-приложение (с транзакцией) в IIS что...
    выполняет вызов компонента COM+
    обновление строки в базе данных SQL

Тестирование :

Запустите приложение .Net и принудительно создайте исключение.

Результат :

Обновление, выполненное из приложения .Net, откатывается назад.
Обновление, выполненное объектом COM+, не откатывается.

Если я вызываю объект COM+ со старой страницы ASP, откат срабатывает.

Я знаю, что некоторые люди могут думать: "что?! COM+ и .Net вы, должно быть, сошли с ума!", но есть некоторые места в этом мире, где все еще есть много компонентов COM+. Мне просто было любопытно, сталкивался ли кто-нибудь с этим и выяснил ли ты, как это сделать.



  Сведения об ответе

PIRLO

04:52, 10th August, 2020

Поскольку VB и .NET будут использовать разные соединения SQL (и нет никакого способа заставить ADO и ADO.NET совместно использовать одно и то же соединение), ваша единственная возможность-это подключить DTC (координатор распределенных транзакций). DTC будет координировать две независимые транзакции, чтобы они фиксировались или откатывались вместе.

Начиная с .NET, EnterpriseServices управляет функциями COM+, такими как DTC. В .NET 2.0 и далее вы можете использовать пространство имен System.Transactions, что делает вещи немного приятнее. Я думаю, что-то вроде этого должно работать (непроверенный код):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

Я не настолько хорошо знаком с этим, чтобы давать вам больше советов на данный момент.

На стороне COM+ ваш объект должен быть настроен для использования (скорее всего, "require") распределенной транзакции. Вы можете сделать это из COM+ Explorer, перейдя в свойства вашего объекта , выбрав вкладку транзакция и нажав на кнопку " требуется ". Я не помню, можно ли это сделать и из кода; VB6 был создан до выпуска COM+, поэтому он не полностью поддерживает все, что делает COM+ (его транзакционная поддержка предназначалась для предшественника COM+, называемого MS Transaction Server).

Если все работает правильно, ваш объект COM+ должен быть включен в существующий контекст, созданный вашим кодом .NET.

Вы можете использовать узел "список распределенных транзакций Coordinator\Transaction" в "Component Services", чтобы проверить и увидеть распределенную транзакцию, созданную во время вызова.

Имейте в виду, что вы не можете видеть изменения от компонента COM+, отраженные на запросах данных со стороны .NET, пока транзакция не будет зафиксирована! На самом деле, можно и в тупик попасть! Помните, что DTC гарантирует, что эти две транзакции будут сопряжены, но они по-прежнему являются отдельными транзакциями базы данных.


  Сведения об ответе

SKY

13:46, 8th August, 2020

Как вы это реализуете? Если вы используете EnterpriseServices для управления транзакцией .NET, то обе транзакции должны быть откатаны, так как вы используете один и тот же контекст для них обоих.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться