Вопрос

Базовая архитектура:n физических ящиков, на каждом из которых размещена одна и та же служба WCF, начал работу балансировщик нагрузки.Каждый ящик попадает в единую инфраструктуру базы данных, которая не поддержка транзакций - не спрашивайте :(

Итак, на уровне доступа к данным моего приложения мне нужен какой-то метод распределенных транзакций.Какие у меня есть варианты?

Обратите внимание, что клиентами моей системы будут устаревшие приложения, взаимодействующие с использованием базовых веб-служб (BasicHttpBinding) и новые блестящие клиенты WCF (NetTcpBinding или NetNamedPipeBinding).


Редактировать 1

Например.будет один вызов на уровень WCF в физическом поле 1, например.РедактироватьEntity(...).Этот вызов вызовет 2 записи в базу данных.После первой записи другой клиент вызывает EditEntity(...) для того же объекта во втором экземпляре моей службы WCF во втором физическом ящике.Во втором поле как я узнаю, что транзакция для этого конкретного объекта уже активна?

Спасибо.

Это было полезно?

Решение

Не уверен, что вы предоставили нам достаточно информации для продолжения, но если я правильно понимаю, вы пытаетесь убедиться, что можете поддерживать транзакцию через службу WCF?Пока ваша БД не поддерживает транзакции, а ваши конечные точки WCF находятся за балансировщиком нагрузки?У меня это правильно?Если так....

Поскольку ваша БД не имеет поддержки транзакций, она переходит на ваш уровень WCF.Это предполагает грубый уровень детализации ваших методов, позволяющий гарантировать, что один вызов службы WCF в достаточной степени охватывает вашу транзакцию.Не распределяйте транзакцию по нескольким вызовам WCF, вы напрашиваетесь на проблемы.


ОБНОВЛЯТЬ:Существуют стратегии, которые можно использовать с балансировщиками нагрузки, обеспечивающими постоянство соединений, но здесь они вам не помогут.Если вы вызываете EditEntity() последовательно, и первая запись предназначена для инициации транзакции, а вторая запись — для завершения транзакции... тогда ваша служба недостаточно детализирована.

Объедините эти два вызова в один метод, т.е.РедактироватьEntityComplete().

Есть ли причина, по которой вы не можете создать один метод, а не два?


ОБНОВЛЕНИЕ № 2:Перефразируя проблему: один метод выполняет записи в базе данных, которая не поддерживает транзакции.Рассматриваемый метод выполняет ряд шагов, которые необходимо выполнить по порядку.Метод WCF предоставляет возможность конкуренции за параллелизм нарушить завершение шагов в правильном порядке.

Исходя из этого, предполагая, что вам не требуются возвращаемые данные от функции, рассмотрите асинхронную очередь, которая может регистрировать запросы от конечных точек WCF.Затем обработайте очередь из одного фонового процесса.


ОКОНЧАТЕЛЬНАЯ ВЕРСИЯ:

Пересмотрите требование не изменять хранилище данных.

Учитывая требования к нескольким клиентам, необходимость масштабирования, балансировки нагрузки и поддержки транзакций в хранилище данных, последнее предложение — подтолкнуть к изменению базы данных.Понимание этого является статическим требованием, но вы потратите много усилий, пытаясь реализовать поддержку транзакций, когда множество простых платформ баз данных предоставят ее вам.Попытка воссоздать эту функциональность имеет мало преимуществ, но много недостатков.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top