0

我正在使用 gearman 的 udf 从更新后触发器向 gearman 发送后台作业。

该文档说明了以下内容:

gman_do* 函数采用可选的第三个参数,即唯一的作业 ID。这允许您在同一个唯一 ID 下提交多个作业,它们将在队列中“合并”以仅运行一次。请注意,gearmand 只会合并队列中或正在运行的作业,它不会在作业完成后跟踪唯一 ID。例如,以下内容确保您只为每个主机运行一次作业:

SELECT gman_do_background("reverse", Host, Host) AS test FROM mysql.user;

这使它看起来已经准备好处理大量的行更新,而不会淹没我的齿轮工的队列。

但是当我一次更新 30k 行时,我的 gearman 守护程序会暂时无法访问,并且“netstat”在 4730 端口上显示 ~30k 连接,我想这可以解释原因。

知道如何在不减慢更新速度的情况下防止冻结发生吗?我只需要在整个更新查询后触发一次 gearman 作业,但据我所知,mysql/mariadb 不处理语句后触发器。

4

1 回答 1

1

MySQL/MariaDB 仅支持执行的触发器FOR EACH ROW(您可能已经注意到触发器语法的这个强制性部分)。

无论如何,我永远不会建议在触发器中调用 Gearman UDF。您无法在触发器中知道生成触发器的更新是否将被提交(或何时提交)。gearman 服务可能会收到有关它无法查看的更新的通知,因为它尚未提交。

相反,忘记触发器。在您的应用程序中编写代码以进行更新,然后确认它成功并且事务已提交。然后才通知 gearman — 通过从您的应用程序调用 gearman API,而不是使用 MySQL UDF。

然后,您可以灵活地为一批更新的行发出通知。

几乎没有什么好的方法可以在 MySQL 中使用任何会导致事务范围之外的副作用的 UDF,而且无论如何也没有必要这样做。

于 2019-06-12T06:31:42.340 回答