我已经为数据库设置了gearman udf,并试图从mysql查询发送gearman作业。正常情况下,它工作得很好。mysql查询的常规调用如下:
SELECT gman_do_background("eventName", "data");
现在,当我试图从mysql触发器实现给出这个调用时,问题正在发生。错误显示如下:
MySQL said: #1415 - Not allowed to return a result set from a trigger
所以,基本上你可以看到,要么
- 有一些其他的方式来调用gearman或
- 不知何故,我做了一个假的更新调用与gearman选择调用里面。
我正在尝试编写触发器,它非常简单,如下所示:
BEGIN
SELECT gman_do_background("eventName", "@data") FROM
(
SELECT @data := CONCAT(a,',',b,',',c) FROM mytablename WHERE status = 1
)
END
但是正如你所看到的,由于'SELECT'操作,它没有保存并抛出上述错误。
谁能帮我是否有任何替代的gearman调用类型(除了'select')或有任何方法来编写更新查询,不影响任何mysql表/列?提前致谢
首先在触发器中做任何非事务性操作都是错误的。在回滚的情况下,您将无法撤销对udf函数的调用。因此,我建议重新考虑对这类调用使用触发器。
强烈推荐阅读:
- 触发器的问题
现在,正如你所发现的,SELECT
在触发器中是被禁止的,因为没有客户端返回结果集。
但是您可以合法地使用INSERT INTO ... SELECT FROM ...
语法。如果在MySQL实例中启用了BLACKHOLE
引擎,您可以创建一个辅助表。你写到blackhole的任何东西都会被写入/dev/null。
CREATE TABLE dev_null
(
value VARCHAR(255) -- adjust data type as needed
) ENGINE=BLACKHOLE;
然后在你的触发器
INSERT INTO dev_null
SELECT gman_do_background('eventName', @data)
FROM
(
...
)
这里是SQLFiddle demo
也许这个链接http://codesamplez.com/development/gearman-from-mysql-udf有帮助(提示2)