MySQL的锁机制有哪几种?

MySQL提供了多种锁机制,主要包括:

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

以上MySQL就主要的锁机制。不同锁提供了锁粒度和可扩展性的权衡。

通过合理使用不同类型的锁,可以很好平衡MySQL的并发性能和一致性要求。