首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL触发器实现中使用gearman客户端

问如何在MySQL触发器实现中使用gearman客户端
EN

Stack Overflow用户
提问于 2014-03-15 00:55:02
回答 2查看 668关注 0票数 0

我已经设置了用于数据库的gearman udf,并试图从mysql查询中发送一个gearman作业。通常情况下,它只是工作正常。作为mysql查询的常规调用,如下所示:

代码语言:javascript
复制
SELECT gman_do_background("eventName", "data");

现在,当我试图从mysql触发器实现中发出这个调用时,问题就发生了。出现以下错误:

代码语言:javascript
复制
MySQL said: #1415 - Not allowed to return a result set from a trigger

所以,基本上,正如你所看到的

  1. 有别的方法可以让变速工打电话或者
  2. 不知怎么的,我用里面的齿轮人选择呼叫做了一个假的更新电话。

我试图编写触发器,它非常简单,如下所示:

代码语言:javascript
复制
BEGIN
    SELECT gman_do_background("eventName", "@data") FROM 
    (
         SELECT @data := CONCAT(a,',',b,',',c) FROM mytablename WHERE status = 1
    )
END

但是正如yo所看到的,由于“SELECT”操作,它没有保存和抛出上面的错误。

有谁能帮我一下吗?是否有任何替代的gearman调用类型(除了“select”),或者是否有任何方式编写不影响任何mysql表/列的更新查询?,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-03-15 20:52:36

首先,在触发器中执行任何非事务性操作的都是错误的。在回滚的情况下,您将无法撤消对udf函数的调用。所以我建议重新考虑使用触发器来处理这类呼叫。

强烈建议阅读:

现在,正如您所发现的,触发器中禁止单独使用SELECT,因为没有客户端可以将结果集返回给。

但您可以合法地使用INSERT INTO ... SELECT FROM ...语法。如果在BLACKHOLE实例中启用了辅助表,则可以使用MySQL引擎创建辅助表。您写到黑洞的任何东西都会转到/dev/null。

代码语言:javascript
复制
CREATE TABLE dev_null
(
  value VARCHAR(255) -- adjust data type as needed
) ENGINE=BLACKHOLE;

然后在你的扳机里

代码语言:javascript
复制
INSERT INTO dev_null
SELECT gman_do_background('eventName', @data) 
  FROM 
(
  ...
)

这是SQLFiddle演示

票数 2
EN

Stack Overflow用户

发布于 2014-07-27 08:15:12

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22418212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档