1) ORACLE与SQL Server数据库当中没有这种语法
2) 在MySQL服务器层实现的,与存储引擎无关
3) 命令格式LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...
a 修饰符LOW_PRIORITY用于之前版本的MySQL,它会影响锁定行为,但是从MySQL 5.6.5以后,这个修饰符已经被弃用。如果使用它则会产生警告
b 一个线程获得在一个表上的read锁
l 该线程和所有其他线程只能从表中读数据
l 当前线程执行写insert和更新update操作都会报错:ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
l 其他线程执行写insert和更新update操作都会被阻塞,直到释放资源后执行
c 一个线程获得在一个表上的read local锁
l 该线程和所有其他线程只能从表中读数据
l 当前线程执行写insert和更新update操作都会报错:ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
l 其他线程可以进行写insert操作,但是更新update操作被阻塞,直到释放资源后执行
d 对于事务型表,如InnoDB表,READ LOCAL与READ相同,因为MySQL的默认事务级别为REPEATABLE COMMITTED
e 一个线程在一个表上得到一个WRITE锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞
4) unlock tables;会解锁当前线程的所有锁
特别注意:lock tables和事务互相影响可能会产生无法预料的结果,因此建议除了事务禁用了AUTOCOMMIT,其他时候不要显式使用lock table