如何强制 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
,这就是锁定的原因。
我简单地改了一下,问题就解决了。
假设我们有两个 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
,这就是锁定的原因。
我简单地改了一下,问题就解决了。