SQL数据更改时触发脚本

问题描述

我正在尝试创建一个实时反应控制面板,因此,当您按下Web控制面板上的一个按钮时,数据(是或否)将进入sql数据库PHPmyadmin),并且当数据更改为sql数据库时应该在树莓派上触发一个脚本,该脚本将打开灯。

我知道如何将数据写入sql数据库以及如何用树莓派控制灯,但我不知道如何在更新sql数据库中的数据时触发或执行某些操作。

它需要持续运行,例如最多需要20毫秒的反应时间。谁能帮我这个? sql数据库在Ubuntu上运行,并且基于PHPmyadmin。

问候, 朱尔斯

示意图: DataUpdateGraphical

解决方法

在MySQL中使用触发器来激活任何外部进程不是一个好主意。原因是触发器在INSERT / UPDATE / DELETE执行时触发,而不是在事务提交时触发。因此,如果外部进程收到该事件,它可能会立即去查询数据库以获取有关该数据更改的其他详细信息,并发现它看不到未提交的数据。

相反,我建议写入数据库的任何应用程序都应负责创建通知。只有这样,应用程序才能等待,直到之后确认已确认交易。

因此,处理按钮按下操作的PHP代码将插入/更新数据库中的某些数据,并检查SQL是否已完成且没有错误(总是检查执行SQL语句的结果)和提交的事务。

然后,相同的PHP代码随后调用您的脚本,或将偶数发布到该脚本正在等待的消息队列中,或类似的操作。

请不要将MySQL用作穷人的消息队列!这不是正确的工具。


相同的建议适用于您要在数据库外部执行的任何其他操作。例如发送电子邮件,编写文件,进行http API调用等。

请勿在SQL触发器中执行此操作,因为外部操作不遵守事务隔离。触发器或级联数据更新之一可以被回滚,但是外部操作的效果无法回滚。

,

MySQL无法通过触发器将事件传递给外部软件。这就是将数据库推送事件发送到应用程序所需要的。

(实际上,可以安装user-defined function并将行业标准的消息发送到诸如之类的消息队列系统。但是您将必须控制整个服务器,和您的数据库管理员,以进行安装。)

替代方法:每隔一段时间运行一次查询以检索更改的信息,并将其推送到您的应用程序。那是一个令人讨厌的选择:轮询是xxx脖子上的一种痛苦。

您能否让您的服务器应用程序在更新数据库时检测到更改?需要进行一些编程和测试,但这是解决您的问题的好方法。

除了MySql外,还可以使用redis代替/。只要值发生更改,redis就会将事件发送到Web服务器,这对于您想做的事情来说几乎是完美的。 https://redis.io/topics/notifications