MyISAM:对整张表进行加锁,锁全表而不是行。在读数据的时候,所有的表上都可以获得共享锁(读锁),每个连接都不互相干扰。在写的时候,或者排他锁,会把整个表进行加锁,而其他的连接请求(读和写)都处于等待。
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
[root@MyO test]# echo "a" >> myisam_tab.MYD
mysql> check table myisam_tab;
+-----------------+-------+----------+---------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-----------------+-------+----------+---------------------------------------------------+
| test.myisam_tab | check | warning | Size of datafile is: 102 Should be: 100 |
| test.myisam_tab | check | error | got error: 120 when reading datafile at record: 5 |
| test.myisam_tab | check | error | Corrupt |
+-----------------+-------+----------+---------------------------------------------------+
3 rows in set (0.01 sec)
mysql> repair table myisam_tab;
+-----------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------+--------+----------+----------+
| test.myisam_tab | repair | status | OK |
+-----------------+--------+----------+----------+
1 row in set (0.01 sec)
mysql> check table myisam_tab;
+-----------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------+-------+----------+----------+
| test.myisam_tab | check | status | OK |
+-----------------+-------+----------+----------+
1 row in set (0.00 sec)
参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2398276.html