MySQL提供了多种锁机制,主要包括:
- table lock 表锁
当一个事务需要访问表时,会给该表上锁。
其他事务在该事务完成之前,无法访问该表。
与所有锁相比,性能最低。
LOCK TABLES customers WRITE;
# 操作 customers 表数据
UNLOCK TABLES;
- row lock 行锁
只锁定单条记录,多个事务可以同时访问表。
只有在访问同一行时才会存在冲突。
SELECT * FROM customers WHERE id = 1 FOR UPDATE;
# 获得id=1 行的行锁
UPDATE customers SET ... WHERE id = 1;
# 更新锁定行
COMMIT;
# 释放行锁
- page lock 页锁
锁定表中的一页(一般为16KB),多个事务可以同时访问不同页。
性能在表锁和行锁之间。
MySQL Innodb默认使用。 - intention lock 意向锁
在mysql中,编译器会在获取共享或排它锁前,先申请相应类型的意向锁。
稍后再申请实际的物理锁。
不同的意向锁不会发生阻塞。 - metadata lock 元数据锁
在mysql中,对数据库的结构信息进行操作时,会自动获取元数据锁。
比如在创建/删除表时会自动获取此类锁。
以上MySQL就主要的锁机制。不同锁提供了锁粒度和可扩展性的权衡。
通过合理使用不同类型的锁,可以很好平衡MySQL的并发性能和一致性要求。