如何强制 MySql 不锁定触发器中使用的所有表

How to force MySql not to locking all tables used in a trigger

假设我们有两个 table,messages (msgid , mbody)logs (logid, lbody)。我们在 messages 上添加一个 AfterUpdate 触发器,如下所示:

BEGIN
    if new.msgid = 7 then
        do sleep(20);
        UPDATE logs SET lbody = 'test' WHERE logid = 5;
    end if;
END

然后,我们用 msgid = 7 更新行,它休眠 20 秒。 同时,我们想更新 logs 中的随机行,但我们必须等到睡眠结束,因为整个 logs table 都被锁定了!!

实际上,我在触发一些进程时遇到了一个非常大的问题,因为所有使用的 table 都被锁定了。

有什么方法可以明确告诉 MySql 不要锁定触发器中使用的所有 table 中的所有行? 如有任何建议,我们将不胜感激。

经过大量探索,我注意到 logs table 的引擎是 MyISAM 而不是 InnoDB,这就是锁定的原因。 我简单地改了一下,问题就解决了。