书接上文
在MySQL中MyISAM类型表不能支持事务的处理,用户可以选择应用表锁来代替事务。这种引用表锁定来代替事务的事件被称为伪事务。使用表锁定来锁定表的操作可以加强非事务表在执行过程的安全性和稳定性。
用表锁定代替事务
在MySQL的MyISAM类型表中是不支持COMMIT,和ROLLBACK命令,对数据库执行插入,更新,删除时会立刻被保存到磁盘中,在多用户的环境中这样的操作会导致诸多问题,为了避免同一时间有多个用户对数据库的指定表进行操作,就可以应用表锁来避免在用户操作数据表的过程中收到干扰。当且仅当该用户释放表的操作锁定后,其他用户才可以访问这些修改后的数据表。
1.为指定数据表添加锁定
LOCK TABLES tb_name lock_type[,tb_name,lock_type,...];
其中tb_name为表的名字,lock_type为锁定类型(READ(读方式)/WRITE(写方式))
2.用户执行数据表的操作(添加,更改,删除)
3.完成锁定表的操作后,解锁该表
UNLOCK TABLES;
以读方式锁定数据表
以读方式锁定数据表,是设置锁定用户的其他操作方式,如删除,插入,更新都不被允许。其他用户也只能读取,不能其他操作。如果要进行其他的操作则执行锁定的用户必须执行解锁操作
锁定表的主用户A
mysql> LOCK TABLES student READ; 以读方式锁定数据表
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM student; 查询数据表
+------+
| name |
+------+
| wang |
+------+
1 row in set (0.00 sec)
mysql> INSERT student VALUES('he'); 向数据表插入记录失败
ERROR 1099 (HY000): Table 'student' was locked with a READ lock and can't be updated
mysql>
操作表的用户B
mysql> USE love;
Database changed
mysql> SELECT * FROM student;
+------+
| name |
+------+
| wang |
+------+
1 row in set (0.01 sec)
mysql> INSERT student VALUES('ha');
ERROR 1099 (HY000): Table 'student' was locked with a READ lock and can't be updated
说明:在上面的代码中当用户A锁定表后,B用户可以查询表,但是不能插入记录,当用户B在写完INSERT语句后按Enter键后,会弹出错误信息
以写方式锁定数据表
表的写锁定时设置用户可以修改表中的数据,但是除自己以外的其他用户不能进行任何读操作
主用户A锁定
mysql> LOCK TABLES student WRITE; 以读方式锁定表
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM student; 可以查询表
+------+
| name |
+------+
| wang |
| ha |
+------+
2 rows in set (0.00 sec)
mysql> INSERT student VALUES('zhang'); 可以插入数据
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE student SET name='he' WHERE name='ha'; 可以修改数据
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
用户B的操作
mysql> SELECT * FROM student;
_
mysql> INSERT student VALUES('li');
_
说明:在主用户A没有解锁的情况下,用户B向student表中插入数据,按Enter键后一直处于等待状态没有任何显示,只有主用户A解锁表后B用户的SQL语句会立即显示执行的结果(正确插入还是语法错误),查询也是一样的
注意:这张表的引擎为MyISAM