表级锁用于控制多会话对表的并发访问,主要有共享读锁和独占写锁两种模式;共享读锁允许多个会话并发读但禁止写,独占写锁仅允许单会话读写并阻塞其他所有操作;其开销小但并发性低,适用于MyISAM等引擎,高并发场景下易成瓶颈,InnoDB通过行级锁提升并发性能。
mysql中的表级锁主要用于控制多个会话对表的并发访问,尤其在使用MyISAM、MEMORY等存储引擎时较为常见。表级锁的开销小,加锁快,但并发性能相对较低。表级锁主要有以下两种模式:
1. 表共享读锁(table Read Lock)
当一个会话对某张表加上共享读锁后,该会话和其他会话都可以读取这张表的数据,但任何会话都不能修改数据,直到所有读锁被释放。
例如:
LOCK TABLES t_read READ;
select * FROM t_read; — 可以执行
UPDATE t_read SET col=1; — 阻塞或报错
多个会话可以同时持有同一张表的读锁,因此读操作是并发允许的。
2. 表独占写锁(Table Write Lock)
当一个会话对某张表加上写锁后,只有该会话可以读写这张表,其他会话既不能读也不能写,必须等待写锁释放。
例如:
LOCK TABLES t_write WRITE;
SELECT * FROM t_write; — 可以执行
UPDATE t_write SET col=1; — 可以执行
写锁是排他的,即使另一个会话只需要读取,也必须等待写锁释放。
基本上就这些。表级锁虽然简单高效,但在高并发写入场景下容易成为瓶颈,InnoDB引擎通过行级锁提供了更好的并发性能。