MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 3719|回复: 1
打印 上一主题 下一主题

内存表与innodb表关联查询时引发的Waiting for table level lock

[复制链接]
跳转到指定楼层
1#
发表于 2015-11-22 00:49:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、现象描述
       有在线表A(memory引擎),记录表B(innodb引擎)。A表需频繁的增、删除记录,假定每天100W新增,同时偶偶后端需查看下在线列表。B表是登录记录,只会新增不会删除。
       现做50并发测试。A表与B表进行关联查询(mysql线程ID为1)时,往A表插入记录(mysql线程ID为2),同时后端打开在线列表页面(mysql线程ID3)。show processlist后,发现id1状态是sending data,而id2、id3状态为“Waiting for table level lock”


二、初步分析
       1、 id1的sql执行时,会往A表加上共享读锁,由于A表是表级锁,所以id2的sql无法insert。但关键是既然A表现在是共享读锁,我id3应该也能够执行,为什么也出现waiting呢?

        2、用navicate开启session1、session2、session3 输入框。session1手动lock A表,然后查询A表,可以返回结果,session2 输入框 插入insert 记录到A表,则显示白框,session3输入框查询A表,返回输出结果。后session1 手动unlock tables,释放读锁,session2的insert返回执行成功结果。所以从本次试验正验证了A表加读锁后,另外线程是可以继续查询的。

       3、那么问题来了,为什么第1点的情况是怎么出现的呢。各位高手,帮忙分析分析,是否两种不同存储引擎关联查询时会出现这样的情况




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
发表于 2015-11-23 16:38:57 | 只看该作者
应该把show full processlist时的lock状态的SQL发出来...或再看看 show engine innodb status\G 的状态提示
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-3 23:21 , Processed in 0.065140 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表