mysql - 如何强制 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 不要锁定触发器中使用的所有表中的所有行?任何建议将不胜感激。
解决方案
经过大量探索,我注意到logs
表的引擎MyISAM
不是InnoDB
,这就是锁定的原因。我只是改变了它,问题就解决了。
推荐阅读
- python - 如何让 Keras 在特定 GPU 上训练模型?
- sql-server - 命令在控制台中运行良好,但在 Powershell 使用时运行良好
- android - RxJava repeatWhen 在 Mockito 中不再调用
- html - 1页上的Bootstrap 2模态?
- android - 安卓通过低功耗蓝牙接收到的信息包处理速度慢的原因是什么?
- html - 每行的第 4 个成员在 css 的网格中不对齐
- tcl - 来自字符串的来源
- sql - 无法将对象的值从节点返回到 Angular
- php - 从用户无权访问但php服务器的服务器打开文件
- node.js - 加入新代理后如何获取 twilio 会议的参与者列表