如何使用 MySQL 在多个客户端之间高效地同步数据?
Posted
技术标签:
【中文标题】如何使用 MySQL 在多个客户端之间高效地同步数据?【英文标题】:How to efficiently sync data between multiple clients with MySQL? 【发布时间】:2019-05-31 10:33:57 【问题描述】:我正在建立一个基于 arduino 的网络,该网络具有多个控制器(电话、网页、PC 应用程序)来配置中继系统(基础)。该网络使用 mysql 数据库来存储和同步客户端和基础之间的配置。所有客户端和基地都可以操作配置,并且客户端应该看到基地的实时配置。这意味着如果客户端更改了配置,所有其他客户端和基础都应该看到此更改。如何在此网络中同步数据并避免冲突?有没有高效的算法?
我使用数据库服务器的时间戳来跟踪更改。每当 db 更改时,它都会保存时间戳。所有客户端都获取此时间戳并将其与上次获取的时间戳进行比较。但问题是当 2 个或更多客户端同时访问该数据库时,会发生冲突,并且我会丢失除一个之外的所有客户端的配置更改。 使用时间戳似乎不是一个好主意。如果基础离线,我们无法保存离线期间在基础上所做的更改。因为一旦它重新上线,它就会从数据库中获取配置。 对不起我的英语不好。
【问题讨论】:
【参考方案1】:数据库应该是同步点:在进行更新之前,客户端应该将数据锁定在事务中,进行更改然后提交。
锁定数据的一种方法是将for update
添加到您的选择语句中。 MySQLdocumentation中有更多信息
【讨论】:
【参考方案2】:如果您有不可靠的连接设备,并且有多个客户端修改一组公共数据,那么您天生就有相当复杂的应用程序设计。
您可以这样做的一种方法是将历史记录存储在您的表中。
所以,而不是
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
在这种情况下,您不会更新记录,因此无需担心锁定 - 您只需插入新值,“最后一个获胜”。
【讨论】:
以上是关于如何使用 MySQL 在多个客户端之间高效地同步数据?的主要内容,如果未能解决你的问题,请参考以下文章