@TeslaCtroitel

Как разрешить конфликт данных при одновременном редактирование данных несколькими пользователями?

Здравствуйте, бородатые товарищи программисты. Пишу тут для себя один проект, и вот возникла некоторая архитектурная задача, решения которой я пока не нашёл. Не отрицаю, может плохо искал и тупил, но уж как есть, так есть.
Опишу суть: есть некоторый сервер и некоторое количество клиентов. Клиент может принять данные от сервера, возможно, отредактировать их и отправить обратно. Сервер может брать данные из внутреннего хранилища (БД) и отправлять эти данные клиентам (возможно многим одни и те же, шаринг присутствует), после чего принимать эти данные и писать их в БД. Ну, стандартная архитектура в общем. И всё хорошо, пока >2 клиентов не попытаются отправить изменённые одни и те же данные.
Пример: на сервере в БД есть ячейка со строкой "Hello, Habr!". Подключаются два клиента и забирают эту строку с сервера. Первый клиент изменяет строку на "Hello, Habrahabr!", второй на "Hello, Habr and Geektimes!", после чего они оба отправляют их на сервер, где эти строки сохраняются в условную временную таблицу. Как серверу разобраться, что положить в основную ячейку в БД?
При этом информация не должна быть утеряна. Можно, конечно, уведомить пользователя о конфликте версий и оставить трудный выбор на него, но ведь меньше окошек и надоедающих предупреждений = лучше.
Какие у кого есть идеи? Буду благодарен.
P.S. Сервер - C# под .NET 4.5, потом будет C++11. Клиент - С# под .NET 4.5 и Java.
P.S.S. Быть может, подойдёт решение подобной проблемы в Git или MS Word? Есть информация, как реализовано?
  • Вопрос задан
  • 1062 просмотра
Решения вопроса 1
@vGrabko99
html, css, js, php, golang, mysql
В запросе в сервису отправляйте данные в формате
{
"text" : "то что редактируете",
"text_update" : "на что редактируете"
}


Потом сравнивайте text с тем что в базе. Если совпадает то обновляете значение и возвращайте http статус 200. Если нет то отправляете http статус 205 Reset Content (говорит о том что надо обновить документ).

Потом на клиенте смотрите какой статус отправил сервер. Если 200 то говорите что мол всё хорошо запись обновлена. Если 205 то говорите что эти данные изменились

А чтобы отследить изменение строки в реальном времени можно заюзать веб сокет
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
2ord
@2ord
Есть оптимистические и пессимистические блокировки.
Database Locking: What it is, Why it Matters and W...
A beginner’s guide to database locking and the los...
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
Формулируете алгоритм, по которому сервер должен решать что записать, реализовываете, PROFIT. Только вы не сможете сформулировать, поэтому это не задача для сервера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы