开发者社区> 问答> 正文

RDS MySQL MyISAM 表级锁等待的产生和处理


问题描述:


RDS MySQL MyISAM 表级锁等待的产生和处理


解决过程:


在使用 MyISAM 引擎表过程中,经常会碰到会话处于表级锁等待(Waiting for table level lock)的情况,经常会导致连接数堆积,严重的情况下会出现由于实例连接数被占满而应用无法正常连接的情况。
注:RDS MySQL 不推荐使用MyISAM引擎表,因为其不支持事务,读写相互冲突(同一时间仅能执行读取或写入),仅支持表级锁,且有数据丢失的风险。


1. 出现表级锁等待的原因
MyISAM引擎表上有长时间未结束的查询
在该查询执行过程中,出现DML数据修改语句(比如 Insert、Update、Delete、Replace)
比如:

可以看到:
表 perf_test_myisam 上有一条长时间没有结束的查询(本例选择了一条SQL注入查询) - select * from perf_test_myisam where id = 15 OR 1=sleep(300)
在这条查询执行的过程中,又有一条数据修改语句出现 - update perf_test_myisam set detail='my_test' where id = 9
由于MyISAM 引擎表读写相互冲突,因此后提交的 update 语句需要等待之前的 Select 语句完成;而在 update 语句之后的任何语句,则要等待 update 语句的完成。随着对该MyISAM引擎表访问的不断增加,连接数也开始堆积。


2. 解决方法
终止长时间的查询(在本例中,终止 ID 为 118013161的长时间执行会话)。
如何终止会话,请参考:RDS MySQL 如何终止会话。
如何管理长时间的查询,请参考:RDS MySQL 管理长时间运行查询

展开
收起
阿里云柳璃 2015-12-08 11:14:21 8715 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像