TransactionScope для доменов приложений и процессов

Реально ли использовать System.Transactions (прежде всего TransactionScope) в разных доменах приложений и процессах?

DependentTransaction работает только внутри одного AppDomain.

2 ответа

Решение

Да, это работает. Мы проводим транзакции через WCF, вызываем компоненты транзакционных компонентов COM+ и вручную передаем транзакции из веб-службы.NET 2.0 asmx в службу WCF.

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

ОБНОВИТЬ

Мы не используем DependentClone, Мы передаем транзакцию как байтовый массив, используя GetTransactionFromTransmitterPropagationToken, Очень похоже на второй пример распространения транзакции между доменами приложений.

В качестве примера:

Клиент:

public void CallOutOfProcessAndPassTransaction
{
    Client client = new Client();

    client.DoSomethingTransactional(
        System.Transactions.TransactionInterop.GetTransmitterPropagationToken(
            System.Transactions.Transaction.Current)
    );
}

Обслуживание:

public void DoSomethingTransactional(byte[] tx)
{
    using (TransactionScope ts = new TransactionScope(
               TransactionInterop.GetTransactionFromTransmitterPropagationToken(tx)))
    {
        // Do Something

        // vote to commit the transaction if the caller also agrees
        ts.Complete();
    }
}

Я нашел проблемы с этим стилем решения. В моем случае я делал работу с родителями и несколькими детьми. Чтобы заставить его работать, мне пришлось использовать TransactionScope только в родительском. Мой собственный вопрос / ответ на Использование транзакций между процессами.

Другие вопросы по тегам