|
看MYSQL文档对MyISAM引擎的描述:
如果数据文件中间的表没有自由块了,在其它线程从表读的同时,你可以INSERT新行到表中。(这被认识为并发操作)。自由块的出现是作为删除行的结果,或者是用比当前内容多的数据对动态长度行更新的结果。当所有自由块被用完(填满),未来的插入又变成并发。
个人理解,select的时候锁定,t锁定范围应该是该表所在文件的开始地址到最高地址,如果中间没有删除的行,不影响其他session的insert,如果表的中间有delete的数据,其他session执行insert的时候需要等待执行select语句的session释放锁,但是效果不是这样?
mysql> delete from test_isam limit 1000;
Query OK, 1000 rows affected (0.05 sec)
mysql> select count(*) from test_isam;
+----------+
| count(*) |
+----------+
| 999023 |
+----------+
1 row in set (0.00 sec)
session 2:
mysql> select * from test_isam;
这个过程很长。。。
[/COLOR]
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.02 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> select count(*) from test_isam;
+----------+
| count(*) |
+----------+
| 999034 |
+----------+
1 row in set (0.00 sec)
mysql> insert into test_isam(id,mc) values(1,'1');
Query OK, 1 row affected (0.00 sec)
mysql> select count(*) from test_isam;
+----------+
| count(*) |
+----------+
| 999035 |
+----------+
1 row in set (0.00 sec) |
|