Я работаю над службой WCF, чтобы помочь нашему новому коду взаимодействовать с устаревшей системой. Процесс идет так:
- Клиент вызывает сервис с запросом на устаревшую систему.
- Сервис записывает запрос в базу данных.
- Устаревшие системные сервисы запрашивают у БД в свое время и записывают результаты обратно в БД (обновляя флаг состояния, чтобы сказать результаты готовы ).
- Клиент получает результаты, вызывая второй сервисный метод, который опрашивает БД, пока не будет установлен флаг готовности.
- Непосредственно перед возвратом результатов служба обновляет флаг состояния на у клиента есть результаты , так что связанные строки БД могут быть удалены.
Меня беспокоит состояние гонки на последнем этапе. Я вижу, как это происходит:
- Состояние обновления службы до у клиента есть результаты .
- Время ожидания клиента истекло после ожидания запроса службы в БД.
- Служба пытается вернуть результаты. Веселье наступает.
Одним из способов решения этой проблемы было бы использование трех вызовов службы вместо двух: второй вызов извлекает результаты, а последний - явное подтверждение клиентом того, что они есть. Хотелось бы знать, есть ли способ, который не налагает на клиента эту дополнительную «протокольную» нагрузку.
Я кратко рассмотрел использование транзакций в WCF, и похоже, что они могут делать то, что мне нужно. Клиент (опционально) запускает транзакцию, передает ее в службу, которая использует ее, если она там есть, и фиксирует ее по завершении. Кажется, что это неявно делает "третий вызов".
Есть ли у этой идеи какие-либо достоинства? Какие недостатки вы можете увидеть? Есть ли другие пути, которые я мог бы изучить?