Конфликты

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

Отслеживание конфликтов производится с помощью HTTP-заголовка If-Match. Когда приложению необходимо сохранить изменения в удаленной базе данных, оно передает в заголовке If-Match номер ревизии, для которой нужно применить изменения. Если ревизия, указанная в этом заголовке, совпадает с текущей ревизией на сервере, то сервер выполняет запрос и возвращает клиенту заголовок ETag, содержащий номер новой ревизии. Если же номер ревизии в заголовке If-Match отличается от номера текущей ревизии на сервере, то выполнение запроса прекращается, и сервер возвращает сообщение об ошибке.

При возникновении конфликта приложение должно обновить локальные данные, прежде чем снова пытаться сохранить изменения на сервере. Обновить локальные данные можно двумя способами. Первый способ, наиболее распространенный, — с помощью изменений, которые сервер вернул в ответе. Дело в том, что API сохраняет на сервере историю всех изменений от ревизии к ревизии. При возникновении конфликта помимо сообщения об ошибке сервер высылает список изменений между двумя ревизиями (ревизией, указанной в заголовке If-Match, и текущей ревизией удаленной базы данных).

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

В таблице ниже приведены коды ошибок и сообщения сервера при указанных выше конфликтных ситуациях, а также рекомендации по их разрешению.

Конфликт Код ошибки Сообщение об ошибке Способ разрешения

Приложение пытается сохранить изменения в удаленной базе данных. Текущее состояние удаленной базы данных незначительно отличается от состояния локальной базы данных (на сервере еще хранятся изменения между этими ревизиями).

409

Текущая ревизия удаленной базы данных немного старше ревизии локальной копии базы данных.

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

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

Приложение пытается сохранить изменения в удаленной базе данных. Текущая ревизия удаленной базы данных сильно отличается от ревизии локальной базы данных (изменения между этими ревизиями уже не доступны).

410

Текущая ревизия удаленной базы данных намного старше ревизии локальной копии базы данных.

Обновить локальную базу данных с помощью списка изменений уже невозможно.

Клиентскому приложению необходимо получить снапшот удаленной базы данных и полностью обновить локальную базу данных.

Конфликт Код ошибки Сообщение об ошибке Способ разрешения

Приложение пытается сохранить изменения в удаленной базе данных. Текущее состояние удаленной базы данных незначительно отличается от состояния локальной базы данных (на сервере еще хранятся изменения между этими ревизиями).

409

Текущая ревизия удаленной базы данных немного старше ревизии локальной копии базы данных.

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

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

Приложение пытается сохранить изменения в удаленной базе данных. Текущая ревизия удаленной базы данных сильно отличается от ревизии локальной базы данных (изменения между этими ревизиями уже не доступны).

410

Текущая ревизия удаленной базы данных намного старше ревизии локальной копии базы данных.

Обновить локальную базу данных с помощью списка изменений уже невозможно.

Клиентскому приложению необходимо получить снапшот удаленной базы данных и полностью обновить локальную базу данных.