MySQL中的锁有哪些?

MySQL中有多种类型的锁,主要包括:

  1. 共享锁(读锁):S锁,允许一个线程读取数据,并阻止其他线程写入该数据。
sql
SELECT * FROM table1 WHERE ... LOCK IN SHARE MODE;
  1. 排他锁(写锁):X锁,允许一个线程写入数据,并阻止其他线程读写该数据。
sql
SELECT * FROM table1 WHERE ... FOR UPDATE;
FOR UPDATE子句会自动加排他锁。
  1. 意向共享锁:IS锁,在一个表上加S锁之前,会先在该表的所有索引记录上加IS锁,表示想对表加S锁。
  2. 意向排他锁:IX锁,在一个表上加X锁之前,会先在该表的所有索引记录上加IX锁,表示想对表加X锁。
    IS锁和IX锁都是用来控制并发加锁的,加在索引上而不是真实的数据行上。
  3. 自动增长锁:当对一个带自动增长列的表执行INSERT语句时,MySQL会自动加一把排他锁以确保自动增长值的安全。
    例如:
sql
CREATE TABLE table1 (
    id INT AUTO_INCREMENT, 
    ...
)

INSERT INTO table1 (col1, col2) VALUES (..., ...); 
# 这里会自动加一把排他锁

MySQL的行级锁是针对索引加的锁,而不是真实的数据行。这可能会导致间接锁定不相关的行,影响并发性。
InnoDB存储引擎从MySQL 8.0开始支持新的行锁算法-下一键锁定算法,可以显著减少锁冲突。