**** MyISAM引擎下如何设置表锁****
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,我们不需要手动去做任何的操作!
MyISAM在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,,我们不需要手动去做任何的操作,因此,只要给表设置myisam引擎,就可以了。
****阻塞发生的场景****
对MyISAM表读操作时候,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求
对MyISAM表写操作,则会阻塞其他用户对该表的读写操作,当一个线程获得对一个表的写锁后可以对表进行更新操作,其他线程的读、写操作都会等待,直到锁被释放为止
接下来通过实践来观察下,对MyISAM表读操作时候,会如上面我们说的那样其他用户对该表的读请求不会阻塞,写请求会阻塞吗?
(先建立一张test表,存储引擎为myisam,字段为id,name,并插入几条数据)
(1)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行select,观察:
注:sleep(4)是每条数据暂停4秒的意思,如果select的结果数据有1条就会暂停4秒,有3条就会暂停12秒
(2)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行update,观察:
(3)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行delete,观察:
(4)A窗口在select的时候特意暂停了12秒,然后立即去B窗口执行insert,观察:
经过上面的4个测试,我们可以看到myisam表在执行查询操作的时候,其他进程对该表的读操作没有影响,但是写操作(增删改查)会发生阻塞,直到第一个获得读锁的进程操作完成释放完读锁后,写操作才能进行。