【问题标题】:How To Use gearman client in MySQL Trigger implementation如何在 MySQL 触发器实现中使用 gearman 客户端
【发布时间】:2014-07-27 16:15:12
【问题描述】:

我已经设置了gearman udf for database 并尝试从 mysql 查询发送一个 Gearman 作业。通常它工作正常。从mysql查询的常规调用如下:

SELECT gman_do_background("eventName", "data");

现在,当我尝试从 mysql 触发器实现发出此调用时,问题正在发生。出现如下错误:

MySQL said: #1415 - Not allowed to return a result set from a trigger

所以,基本上如你所见,要么

  1. 还有其他方法可以调用 gearman 或
  2. 不知何故,我用里面的 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 表/列的更新查询?提前致谢。

【问题讨论】:

  • 发布您如何定义gman_do_background。它似乎是一个函数
  • 嗨,Ravinder,它由 gearman 提供(您可以在链接上看到)。文档在这里:dl.dropboxusercontent.com/u/16060416/README.txt。是的,它被声明为 mysql 函数。
  • select ... 是否在 trigger 正文中使用?如果是,它们不能是动作 terminating 语句,而只能作为在正文中使用的游标。
  • 是的,正如我在帖子中提到的,gearman 库提到将其用作 'SELECT ...' 。并且看不到改变它的方法。那么,正如我在第二个选项中所说,有没有办法创建一个真正不会导致任何真正更新的虚假 UPDATE 语句?
  • 除非您发布您的触发器主体是什么样的,否则没有人可以提供建议。

标签: mysql sql triggers gearman


【解决方案1】:

首先在触发器中做任何非事务性操作都是错误的。如果发生回滚,您将无法撤消对 udf 函数的调用。所以我建议重新考虑对此类调用使用触发器。

强烈推荐阅读:


现在您发现 SELECTs 自己被禁止在触发器中使用,因为没有客户端可以将结果集返回到。

但是您可以合法地使用INSERT INTO ... SELECT FROM ... 语法。如果您的 MySQL 实例中启用了 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演示

【讨论】:

    【解决方案2】:

    也许这个链接 http://codesamplez.com/development/gearman-from-mysql-udf 有帮助(提示 2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      相关资源
      最近更新 更多