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的并发性能和一致性要求。