Перейти к содержимому

Документация Corta

Как обрабатывать ошибку устаревших данных (Stale Data) в Corta

Ошибка устаревших данных (stale data) возникает, когда Corta обнаруживает попытку изменить объект, который уже был изменён параллельным или предыдущим запросом.

Это стандартный механизм защиты целостности данных в корпоративных информационных системах, участвующих в массовых или параллельных изменениях.

На схеме ниже показан сценарий возникновения ошибки устаревших данных.

Пример: массовое обновление записей

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

curl -X POST "$BASE_URL/api/compose/namespace/$NAMESPACE_ID/module/$MODULE_ID/record/" \
  -H 'accept: application/json, text/plain, */*' \
  -H "authorization: Bearer $JWT" \
  -H 'content-type: application/json' \
  --data-raw "{
    \"records\": [{
      \"set\": [{
        \"recordID\": \"$RECORD_ID\",
        \"moduleID\": \"$MODULE_ID\",
        \"values\": [
          { \"name\": \"телефон\", \"value\": \"+7 999 123-45-67\" }
        ],
        \"namespaceID\": \"$NAMESPACE_ID\",
        \"createdAt\": \"2023-03-01T09:15:00Z\",
        \"updatedAt\": \"2023-03-02T11:40:22Z\"
      },
      {
        \"recordID\": \"$RECORD_ID\",
        \"moduleID\": \"$MODULE_ID\",
        \"values\": [
          { \"name\": \"email\", \"value\": \"Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.\" }
        ],
        \"namespaceID\": \"$NAMESPACE_ID\",
        \"createdAt\": \"2023-03-01T09:15:00Z\",
        \"updatedAt\": \"2023-03-02T11:40:22Z\"
      }]
    }]
  }" \
  --compressed

В этом примере:

  • Первый блок изменяет данные записи на сервере.
  • Когда сервер обрабатывает второй блок, данные ресурса уже изменены, и состояние записи на сервере отличается от того, что указано во второй операции.
  • Результатом становится ошибка устаревших данных, так как в момент обработки второй операции запись уже обновлена первым действием.

Как избежать ошибки при массовых изменениях:

  • Разделите запрос на две отдельные операции: выполните первую операцию, дождитесь ответа, после чего отправьте вторую.
  • Локально определяйте актуальную (последнюю) версию данных и отправляйте только самые свежие значения.

Пример: выполнение бизнес-процесса (workflow)

Ошибка устаревших данных также может появиться в автоматических сценариях выполнения бизнес-процессов, например, при использовании fork-ветвления (ветвление на несколько параллельных путей).

Если вы сначала загружаете запись, а затем пытаетесь параллельно (через разные ответвления) обновить эту же сущность дважды, то первая завершённая операция изменит данные на сервере. При попытке второй операции будет сгенерирована ошибка stale data.

Рекомендация:

  • Используйте параллельные ветви fork только для локального вычисления новых значений без сохранения в базу данных.
  • Запишите изменения в сущность (save) только на последнем шаге, когда все поля установлены в нужное состояние.

Обработка ошибок stale data важна для обеспечения целостности информации в высоконагруженных и распределённых корпоративных системах Corta. Правильное управление версиями данных и организация процесса их изменения позволит избежать конфликтов и предотвратит случайную потерю или перезапись ценной информации.