Давайте рассмотрим пример js «app», который в основном делает CRUD, поэтому он создает, обновляет и удаляет (на самом деле) некоторые «записи».Разрешение конфликтов на основе временной метки без надежной синхронизации времени
В самом базовом случае не нужно разрешать конфликты в таком приложении, так как свойства ACID СУБД используются для выравнивания параллельных обновлений (я просматриваю более тонны деталей здесь, я знаю). Когда нет возможности эмулировать серийное выполнение обновлений, можно использовать временные метки, чтобы определить, какое обновление «выигрывает». Даже тогда клиенту не нужно беспокоиться о временных меток, потому что они могут быть созданы во время запроса на сервере.
Но что, если мы сделаем это еще на один шаг и разрешим обновлениям очереди на клиенте на некоторое неопределенное количество времени (скажем, чтобы приложение работало, когда нет сетевого подключения), а затем выталкивается на сервер ? Тогда временная метка не может быть сгенерирована на сервере, поскольку время, когда обновление было перенесено на сервер, и фактическое время выполнения обновления может сильно различаться.
В идеальном мире, где синхронизируются все часы, это не проблема - просто создайте метку времени на клиенте в момент выполнения обновления. Но на самом деле время часто сходит с «серверного» времени (которое считается идеальным, в конце концов, его конфигурация сервера, что может с ним поделать?), Или просто неверно по часам (возможно когда вы не устанавливаете часовой пояс, а вместо этого обновляете время/дату системы, чтобы они совпадали). Что можно было бы сделать, чтобы объяснить реальность в таком случае?
Возможно, есть какой-то другой способ разрешения конфликтов, который может быть использован в таком случае?
Даже в идеальном мире всех синхронизированных часов разрешение конфликтов при очередном обновлении является нерешенной проблемой. Пользователи получат неожиданные и необъяснимые результаты. Единственный способ справиться с этой проблемой - оставить обновление в «ожидающем» состоянии и сообщить об этом пользователю. –
Примером должно быть «разрешить приложению работать, когда нет активности сети (бездействия)». – user568109
@ user568109: Это пример _one_. Проблема немного более общая, чем – shylent