工作中的项目有问题。我们有一个系统,要求该系统的用户每5秒上传一次心跳(超过10秒的心跳会自动删除),但是,我们使用的监视系统有时会丢失应该存在的条目。我们正在运行MySQL 5.7.20。
客户端初步
这是出现心跳时的数据库图像(很抱歉,必须清空一些信息):
每个客户端发出心跳信号,说明每5秒在线执行一次“操作”。在客户端(在C#中运行)更新心跳的查询为:
INSERT INTO heartbeat (ID, machine, action) VALUES (@ID, @Machine, @Action) ON DUPLICATE KEY UPDATE time = NOW()
这将在客户端执行的所有操作中运行。
问题症状
如果我们在PHP我的管理员中或者通过我们选择使用的任何方法运行SELECT * FROM heartbeat WHERE machine = @Machine
,有时数据库中的数据会瞬间丢失-即,结果将不显示任何结果,或仅显示结果该机器应在线执行的动作的一半。
似乎在客户端运行其各自的INSERT查询时发生,但是为什么结果缺少整体?我曾希望,如果在INSERT查询中完成选择,则时间不会被更新-并不是条目会完全丢失(即,数据库实际上只会显示两个操作处于联机状态,即使实际上有4个操作处于联机状态)线上)。这给我们的报告带来了大问题。
任何有助于缓解此问题的帮助都将非常有帮助