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

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

Ингредиенты:

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

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

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

Результат:

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

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

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

Ответы [ 2 ]

2 голосов
/ 16 сентября 2008

Поскольку VB и .NET будут использовать разные соединения SQL (и нельзя сделать так, чтобы ADO и ADO.NET использовали одно и то же соединение), ваша единственная возможность - подключить 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 + ваш объект должен быть сконфигурирован для использования (скорее всего, «требующего») распределенной транзакции. Вы можете сделать это из COM + Explorer, зайдя в Свойства вашего объекта , выбрав вкладку Транзакция и нажав " Обязательно ". Я не помню, можете ли вы сделать это из кода; VB6 был создан до выхода COM +, поэтому он не полностью поддерживает все, что делает COM + (его поддержка транзакций предназначалась для предшественника COM +, называемого MS Transaction Server).

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

Вы можете использовать узел «Координатор распределенных транзакций \ Список транзакций» в «Службах компонентов», чтобы проверить и увидеть, как создается распределенная транзакция во время вызова.

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

1 голос
/ 22 августа 2008

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

...