Получение связного представления о состоянии данных
https://softwareengineering.stackexchange.com/questions/6723
-
16-10-2019 - |
Вопрос
Вот теоретическая проблема. Это может применяться ко многим системам. Давайте предположим, например, Restful Web Services. Вы хотите что -то узнать, но, как это происходит, вы не можете получить его в одном запросе. Вы можете сделать несколько запросов. Например, у вас есть совместный банковский счет (или банковский счет компании), и вы хотите узнать, сколько там денег. Тем временем кто -то другой передает деньги от проверки сбережений.
Checking: $5,000 Savings: $3,000
Я: Проверка запросов. Ответ: 5000 долларов США
Джо: перевод 4000 долларов от проверки на сбережения
Checking: $1,000 Savings: $7,000
Я: сбережения запросов. Ответ: 7000 долларов США
Всего 12 000 долларов.
Как избежать подобных аномалий? В примере показаны две счета в одном банке, но это также может произойти с двумя счета в двух разных банках.
Решение
Вам нужна какая -то форма контроля параллелизма, чтобы решить подобные проблемы.
Некоторые возможные решения в вашем примере:
- Убедитесь, что сервис может вернуть как сбережения, так и проверки фигур в один запрос, возможно, в общей сложности.
- Реализуйте какой -то сеанс, чтобы пользователь, запрашивающие значения, мог блокировать данные, пока она не закончила читать все значения, в которых она заинтересована. Этот подход часто называют «контролем пессимистического параллелизма».
- Создайте сервис, чтобы вы могли передать свою предыдущую фигуру обратно, когда вы запросите сберегательный рисунок. Если показатель проверки больше не соответствует его предыдущему значению, служба должна указывать на ошибку, а не возвращать значение для сбережений. Этот подход представляет собой вариацию «управления оптомическим параллелизмом».
Другие советы
Предполагая, что это безопасный API, вы можете позволить одному пользователю просматривать/редактировать учетную запись в любой момент времени. Так что полномочия могут выглядеть так:
User: Joe Password: dog Account: Z123456X
После того, как пользователь входит в систему в блокировке, запускается, что сбрасывается с каждым запросом на API. Если они выходят из выхода, блокировка полностью удалена. Если это невозможно, то на самом деле вы мало что можете сделать. При работе с такими данными всегда будут условия гонки. Лучшее, что вы можете сделать, когда кто -то запрашивает API, - это возвращение фактического значения, а также ожидающего значения на основе любых ожидающих транзакций. Это минимизирует вероятность устаревших данных.
Actual: $5,000 Pending: $1,000
Вот почему существуют процессы указанных очищенных и ожидающих деятельности. Так же, как у вас были бы как снятие, так и месторождение в одной и той же транзакции, остатки должны быть связаны и указывать, что существуют ожидающие переводы, поэтому все остатки могут быть недоступны.