mysql 手动锁表

语法:

加锁:
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] …

lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE

解锁:
UNLOCK TABLES
释放当前会话持有的锁。
还可以释放由flush tables with read lock;所加到全局锁(方便备份);

一个会话只能获取到当前会话的锁,不能获取到其他会话的锁。

lock tables 不能应用于临时表(语法可行,但是实际被忽略),实际上也没有必要,因为别的会话也看不到当前会话的临时表

READ [LOCAL] lock:

The session that holds the lock can read the table (but not write it).
持有这个锁的会话可以进行查询操作,但是不能进行插入;
root@localhost [test]>lock tables test read;
Query OK, 0 rows affected (0.00 sec)

root@localhost [test]>insert into test(name) values(‘name’);
ERROR 1099 (HY000): Table ‘test’ was locked with a READ lock and can’t be updated

多个会话可以同时对同一个表加read lock;
其他会话在读取数据的时候可以不显示的加read lock;
local标示符,如果加锁是加到myisam表上的,其他session的insert不会被阻塞。
对于innodb表,read local和read一样

[LOW_PRIORITY] WRITE lock:

会话持有的锁,既可以读也可以写。
只有这个会话可以访问这个表,只有在这个会话解锁的时候其他的会话才能访问这个表。
当这个会话持有这个write锁的时候,会阻塞其他会话持有这个表的write锁。

在老版本中LOW_PRIORITY 是会影响到加锁,5.6.5 之后,会有一个waring,不实用LOW_PRIORITY 即可。

你可能感兴趣的:(MySQL)