MyISAM是表级锁,MySQL表级锁有两种模式:表共享读锁(S锁)和表独占写锁(X锁),就是说对MyISAM表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作,而对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。
当一个线程请求某个MyISAM表的读锁,同时另一个线程请求同一表的写锁,此时写线程会优先获得锁,即使读请求先到锁等待队列,写请求也可以插队成功,MySQL采用写操作优先的锁调试机制,但这也造成一个很大的缺陷,即大量的写操作会造成查询操作很难获得读锁,从而可能造成永远阻塞,所幸可以通过指定参数low-priority-updates来调节MyISAM的读写锁调度行为,降低写请求的优先权利。
MyISAM表的读和写是串行的,即在进行读操作时不能进行写操作,反之也是一样,但在一定条件下MyISAM表也支持查询和表尾插入的操作并发进行,其机制是通过参数concurrent_insert来控制的。