使用LOCK TABLES、UNLOCK TABLES语句验证MySQL存储引擎MyISAM锁机制(一)
背景:
假设表T_01表创建语句如下:
create table t_01 (name varchar(31), age int) engine=myisam;
一、验证获取MyISAM表读锁后,能否对数据进行更新
1. 登录MySQL服务器,启动会话A,获取表T_01读锁
mysql> lock tables t_01 read;
2. 同一会话继续执行插入语句
mysql> insert into t_01(name, age) values ('name01', 23);
注:这个语句执行会抱错"ERROR 1099 (HY000): Table 't_01' was locked with a READ lock and can't be updated"
3. 启用另外的client登录MySQL服务器,启动会话B,执行插入语句
shell> mysql -uxxx -p test
mysql> insert into t_01(name, age) values ('name01', 23);
注:一直等待执行,游标一直闪烁;原因是被读锁阻止执行。
4. 使用会话A,执行释放锁语句
mysql> unlock tables;
注:会话A释放表锁后,会话B自动获取t_01表锁,第三步中的插入语句执行成功
5. 查看记录是否插入成功
mysql> select * from t_01;
注:('name01', 23)这条记录插入成功
结论:
MyISAM表读锁会阻止表上其它写操作
二、验证获取MyISAM表读锁后,能否对数据进行读取
1. 登录MySQL服务器,启动会话A,获取表T_01读锁
mysql> lock tables t_01 read;
2. 同一会话执行查询语句
mysql> select * from t_01;
注:能正常显示表记录结果
3. 启用另外的client登录MySQL服务器,启动会话B,执行插入语句
shell> select * from t_01;
注:能正常显示表记录结果
结论:
MyISAM表读锁不会阻止任何会话在此表上读操作