我正在建立一个基于arduino的网络,该网络具有多个控制器(电话,网页,PC应用程序)以配置中继系统(基础)。该网络使用MySQL数据库在客户端和基础之间存储和同步配置。所有客户端和基础服务器都可以操纵配置,并且客户端应查看基础服务器的实时配置。这意味着,如果客户端更改了配置,则所有其他客户端和基础都应看到此更改。如何在该网络中同步数据并避免冲突?有没有有效的算法?
我使用数据库服务器的时间戳来跟踪更改。每当数据库更改时,它都会保存时间戳。所有客户端都会获得此时间戳,并将其与上一个获取的时间戳进行比较。但是问题是当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".