首页 > 解决方案 > 如何强制 MySql 不锁定触发器中使用的所有表

问题描述

假设我们有两个表,messages (msgid , mbody)并且logs (logid, lbody)。我们添加一个AfterUpdate触发器messages如下:

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表都被锁定了!!

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

有没有办法明确告诉 MySql 不要锁定触发器中使用的所有表中的所有行?任何建议将不胜感激。

标签: mysqlstored-procedurestriggers

解决方案


经过大量探索,我注意到logs表的引擎MyISAM不是InnoDB,这就是锁定的原因。我只是改变了它,问题就解决了。


推荐阅读