1. 什么是表锁定
在 MySQL 中,为保证多个查询之间数据的一致性,可以对数据进行加锁,而加锁的最小单位是行锁,但当涉及到整张表时,会使用表锁定(table lock)。当某个事务要对某一张表进行操作时(例如要执行INSERT、UPDATE、DELETE等语句),可以首先对这个表进行锁定,以防其他事务对这个表进行操作。常见的表锁定方式有两种:共享锁(S锁)和排他锁(X锁)。
2. 共享锁(S锁)与排他锁(X锁)
2.1 共享锁(S锁)
共享锁(S锁)是一种读锁,加上共享锁的数据可以被多个事务共同读取,但是不能进行插入、更新和删除操作。此时其他事务可以加S锁读取数据,但无法加X锁进行写操作,因为写操作需要获取排他锁。
下面是对一张名为person的表添加共享锁的示例:
LOCK TABLES person READ;
-- 进行操作
UNLOCK TABLES;
2.2 排他锁(X锁)
排他锁(X锁)是一种写锁,加上排他锁的数据不能被其他事务读取、更新或删除。只有一个事务能够加上X锁进行操作。
下面是对一张名为person的表添加排他锁的示例:
LOCK TABLES person WRITE;
-- 进行操作
UNLOCK TABLES;
3. 表锁定的优缺点
3.1 优点
表锁定无需考虑行锁定的粒度和死锁问题,因此在处理全表操作或表与表之间的复杂关系时,可以减少锁定的竞争,提高处理速度。
3.2 缺点
表锁定虽然加锁、解锁操作简单,但是在处理并发时,容易造成锁定竞争,从而影响系统性能。例如,一个事务需要修改表中的一行数据,但是此时该表已经被其它事务锁住,这个事务就需要等待其他事务释放锁后才能进行操作。
4. 总结
在实际应用中,表锁定的应用场景有限。在数据库高并发场景下,应避免使用表锁定,而应选用行锁。