日期:2014-05-16  浏览次数:21048 次

使用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表读锁不会阻止任何会话在此表上读操作