Как эффективно синхронизировать данные между несколькими клиентами с MySQL? - PullRequest
1 голос
/ 31 мая 2019

Я настраиваю сеть на основе Arduino, в которой есть несколько контроллеров (телефоны, веб-страница, приложение для ПК) для настройки системы ретрансляции (базы). Эта сеть использует базу данных MySQL для хранения и синхронизации конфигурации между клиентами и базой. Все клиенты и база могут управлять конфигурацией, и клиенты должны видеть конфигурацию базы в реальном времени. Это означает, что если клиент изменяет конфигурацию, все другие клиенты и база должны увидеть это изменение. Как я могу синхронизировать данные в этой сети и избежать конфликтов? Есть ли эффективные алгоритмы?

Я использовал метку времени сервера базы данных для отслеживания изменений. Всякий раз, когда дБ изменяется, он сохраняет метку времени. Все клиенты получают эту метку времени и сравнивают ее с последней выбранной. Но проблема в том, что когда 2 или более клиентов получают доступ к этой базе данных одновременно, возникает конфликт, и я теряю изменения конфигурации всех клиентов, кроме одного. Использование временной метки не кажется хорошей идеей. Если база переходит в автономный режим, мы не можем сохранить изменения, внесенные в базу в автономном режиме. Потому что, как только он возвращается в режим онлайн, он выбирает конфигурацию из базы данных. Извините за мой плохой английский.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

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

Один из способов сделать это - сохранить историю в своей таблице.

Итак, вместо

ID     config_1    config_2 ...  timestamp
----------------------------------------------
1          true         44         24-may-2019:20:00:02
2          false        88         26-may-2019:10:10:06

Вы можете сделать

ID     config_1    config_2 ...  timestamp
----------------------------------------------
1          true         44         24-may-2019:20:00:02
1          false        44         21-may-2019:11:34:34
1          false        22         10-oct-2018:19:22:22
2          false        88         26-may-2019:10:10:06

В этом случае вы не обновляете записи, поэтому вам не нужно беспокоиться о блокировке - вы просто вставляете новые значения, и «выигрывает последнее».

1 голос
/ 31 мая 2019

База данных должна быть точкой синхронизации: перед обновлением клиенты должны заблокировать данные в транзакции, внести свои изменения и затем зафиксировать их.

Одним из способов блокировки данных является добавление for update в операторы выбора. Больше информации в документации по MySQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...