Получение связного представления о состоянии данных

softwareengineering.stackexchange 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 долларов.

Как избежать подобных аномалий? В примере показаны две счета в одном банке, но это также может произойти с двумя счета в двух разных банках.

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

Решение

Вам нужна какая -то форма контроля параллелизма, чтобы решить подобные проблемы.

Некоторые возможные решения в вашем примере:

  1. Убедитесь, что сервис может вернуть как сбережения, так и проверки фигур в один запрос, возможно, в общей сложности.
  2. Реализуйте какой -то сеанс, чтобы пользователь, запрашивающие значения, мог блокировать данные, пока она не закончила читать все значения, в которых она заинтересована. Этот подход часто называют «контролем пессимистического параллелизма».
  3. Создайте сервис, чтобы вы могли передать свою предыдущую фигуру обратно, когда вы запросите сберегательный рисунок. Если показатель проверки больше не соответствует его предыдущему значению, служба должна указывать на ошибку, а не возвращать значение для сбережений. Этот подход представляет собой вариацию «управления оптомическим параллелизмом».

Другие советы

Предполагая, что это безопасный API, вы можете позволить одному пользователю просматривать/редактировать учетную запись в любой момент времени. Так что полномочия могут выглядеть так:

    User: Joe
    Password: dog
    Account: Z123456X

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

    Actual: $5,000 
    Pending: $1,000

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

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