想验证 myisam 表的锁的优先级,做了下面的实验。使用的测试表,结构如下
mysql> show create table tx\G
*************************** 1. row ***************************
Table: tx
Create Table: CREATE TABLE `tx` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
然后分别打开打开三个控制台 ABC ,按下面操作顺序执行:
1 、 A 运行:
mysql> lock table tx read;
Query OK, 0 rows affected (9 min 37.73 sec)
2 、 B 运行:
mysql> select * from tx;
这里在等待
3 、 C 运行:
mysql> insert into tx (num) value (1);
这里在等待
4 、 A 运行:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
此时看控制台 B ,显示
mysql> select * from tx;
Empty set (1 min 25.67 sec)
这里有个疑惑,写锁不是会插到读锁请求之前吗?但是显式的给 B 、 C 加上 lock 语句,就可以看到 C (写)先获得锁。
这是为什么呢?
mysql> show create table tx\G
*************************** 1. row ***************************
Table: tx
Create Table: CREATE TABLE `tx` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
然后分别打开打开三个控制台 ABC ,按下面操作顺序执行:
1 、 A 运行:
mysql> lock table tx read;
Query OK, 0 rows affected (9 min 37.73 sec)
2 、 B 运行:
mysql> select * from tx;
这里在等待
3 、 C 运行:
mysql> insert into tx (num) value (1);
这里在等待
4 、 A 运行:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
此时看控制台 B ,显示
mysql> select * from tx;
Empty set (1 min 25.67 sec)
这里有个疑惑,写锁不是会插到读锁请求之前吗?但是显式的给 B 、 C 加上 lock 语句,就可以看到 C (写)先获得锁。
这是为什么呢?