Фон. Я пишу функцию, ставящую длительные операции в очередь, используя С#,
и каждая операция разделена на 3 этапа:
1. операция базы данных (обновление/удаление/добавление данных)
2. длительный расчет с использованием веб-сервиса
3. Операция базы данных (сохранение результата вычисления на шаге 2) в той же таблице db на шаге 1 и проверка согласованности таблицы db, например, на этапе 1 элементы одинаковы (см. Ниже более подробный пример )
Во избежание грязных данных или сбоев я использую объект блокировки (статический одноэлементный объект), чтобы обеспечить 3 шага, которые нужно выполнить как целую транзакцию. Поскольку, когда несколько пользователей вызывают функцию для выполнения операций, они могут изменять одну и ту же таблицу db на разных этапах во время своих собственных операций без этой блокировки, например, user2 удаляет элемент A в своем шаге1, тогда как user1 проверяет, существует ли A еще в его шаг 3. (дополнительная информация: Между тем я использую TransactionScope из фреймворка Entity, чтобы гарантировать, что каждая операция базы данных является транзакцией, но как повторяемая для чтения.)
Однако мне нужно поместить это на платформу облачных вычислений, которая использует механизм балансировки нагрузки, так что фактически мой объект блокировки не вступит в силу, поскольку функция будет развернута на разных серверах.
Вопрос:, что я могу сделать, чтобы сделать объект блокировки работающим при вышеуказанных обстоятельствах?