Документация Corta
-
Аутентификация
-
Аутентификация внешних приложений
-
Аутентификация с использованием Corta
-
Модель безопасности
-
Управление приложениями
-
Настройка No Code
-
Макеты страниц
-
Версионность изменений
-
Настройка хранения записей
-
Открытие записей во всплывающих окнах
-
Импорт и экспорт приложений
-
Обнаружение дубликатов
-
Справочник типов полей
-
Справочник по блокам страницы
-
Доступ к системе Corta
-
Подключения к базам данных (DAL)
-
Управление подключениями
-
Конфиденциальность данных
-
Автоматизация
-
Детали выполнения автоматизации
-
Бизнес-процессы
-
Подпроцессы
-
Жизненный цикл выполнения
-
Руководство по стилю бизнес-процессов
-
Область видимости бизнес‑процесса: подробно
-
Обработка выбора записей
-
Работа с электронной почтой
-
Тестирование и отладка бизнес-процессов
-
Шлюз интеграции
-
Профайлер маршрутов интеграционного шлюза
-
Поисковый сервис
-
Отчётность
-
Предфильтры в Corta
-
Настройка интеграции данных в 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. Правильное управление версиями данных и организация процесса их изменения позволит избежать конфликтов и предотвратит случайную потерю или перезапись ценной информации.