在大型更新中通过mysql触发器将作业发送给Gearman

时间:2019-06-12 06:27:13

标签: mysql gearman mysql-udf

我正在使用Gearman的udf从更新后触发器将后台作业发送给Gearman。

文档指出以下内容:

  

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

     

SELECT gman_do_background(“ reverse”,Host,Host)AS测试自   mysql.user;

这看起来好像已经准备好处理大量线路更新而不会淹没我的齿轮箱队列了。

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

有什么主意如何防止冻结而又不减慢更新速度?我只需要在整个更新查询后触发一次Gearman作业,但是据我所知,mysql / mariadb不会在语句触发后进行处理。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

在MySQL中使用几乎没有任何UDF会导致事务范围之外的副作用的方法几乎没有,并且也没有必要这样做。