通过实践,我们来看看,对 MyISAM表进行写操作时,会如之前说的那样阻塞其他用户对该表的读写操作吗?
(先建立一张test表,存储引擎为myisam,字段为id,name,并插入几条数据,给test表中插入500w条数据用于测试)
****开始前的小知识点****
开始测试之前,我们需要知道一个小的知识点,因为接下来的测试速度太快,我们需要根据别的指标去判断当时是否发生了阻塞,执行如下命令:
查看锁的争夺状况上图中,箭头标注的地方Table_locks_waited=280,它代表一共发生了280次不能立刻获得锁需要等待的情况,接下来的测试,我们会通过判断测试前 Table_locks_waited的值和测试后Table_locks_waited的值得对比来判断刚刚有没有发生阻塞情况。
(1)A窗口在update时,立即去B窗口执行select,观察:
初始值是280,测试完成后变成了281,说明发生了阻塞等待(2)A窗口在update时,立即去B窗口执行insert,观察:
初始值是281,测试完成后变成了282,说明发生了阻塞等待(3)A窗口在update时,立即去B窗口执行delete,观察:
初始值是282,测试完成后变成了283,说明发生了阻塞等待(4)A窗口在update时,立即去B窗口执行update,观察:
初始值是283,测试完成后变成了284,说明发生了阻塞等待综上,对 MyISAM表写操作,则会阻塞其他用户对该表的读写操作,当一个线程获得对一个表的写锁后对表进行更新操作,其他线程的读、写操作(增删改查)都会等待,直到锁被释放为止。
网友评论