1

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

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

它需要生存,比如在最多 20 毫秒内做出反应。谁能帮我这个?SQL 数据库在 Ubuntu 上运行,并且基于 phpmyadmin。

问候,朱尔斯

示意图: DataUpdateGraphical

4

2 回答 2

1

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

相反,我建议任何正在写入数据库的应用程序都应该负责创建通知。只有这样,应用程序才能等到事务被确认提交之后。

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

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

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


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

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

于 2020-10-31T21:24:29.810 回答
-1

MySQL 没有办法从触发器内将事件传递给外部软件。这就是让数据库将事件推送到应用程序所需要的。

(实际上,可以安装一个用户定义的函数,将行业标准的消息发送到像这样的消息队列系统。但是你必须控制整个服务器和你的数据库管理员才能安装它。)

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

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

除了 MySql 之外,您还可以使用 redis 代替 /。每当值发生变化时,redis 都会向 Web 服务器发送事件,这对于您想要做的事情来说几乎是完美的。 https://redis.io/topics/notifications

于 2020-10-31T18:08:34.930 回答