如何使用MySQL有效地在多个客户端之间同步数据?

时间:2019-05-31 10:33:58

标签: mysql database phpmyadmin

我正在建立一个基于arduino的网络,该网络具有多个控制器(电话,网页,PC应用程序)以配置中继系统(基础)。该网络使用MySQL数据库在客户端和基础之间存储和同步配置。所有客户端和基础服务器都可以操纵配置,并且客户端应查看基础服务器的实时配置。这意味着,如果客户端更改了配置,则所有其他客户端和基础都应看到此更改。如何在该网络中同步数据并避免冲突?有没有有效的算法?

我使用数据库服务器的时间戳来跟踪更改。每当数据库更改时,它都会保存时间戳。所有客户端都会获得此时间戳,并将其与上一个获取的时间戳进行比较。但是问题是当2个或更多客户端同时访问该数据库时,发生冲突,并且我失去了除一个客户端之外所有客户端的配置更改。 使用时间戳似乎不是一个好主意。如果基准服务器脱机,我们将无法在离线时间内保存在基准服务器上所做的更改。因为一旦它重新联机,它就会从数据库中获取配置。 对不起,我的英语不好。

2 个答案:

答案 0 :(得分:1)

数据库应该是同步点:在进行更新之前,客户端应将数据锁定在事务中,进行更改,然后提交。

锁定数据的一种方法是将"London"添加到您的select语句中。 MySQL documentation

中有更多信息

答案 1 :(得分:1)

If you have unreliably connected devices, and multiple clients modifying a common set of data, you inherently have a fairly complex application design.

One way you could do this is to store history in your table.

So, instead of

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

You might do

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

In this case, you're not updating records so don't need to worry about locking - you simply insert new values, and "the last one wins".