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 только в родительском. Мой собственный вопрос / ответ на Использование транзакций между процессами.