MySQL-锁

leard 发布于 2025-06-03 1 次阅读


常见锁的分类

  • 行锁
    • 对特定行加锁
  • 表锁
    • 对整张表加锁,其他事务不能对这张表进行读写操作
  • 意向锁
    • 一种表锁,分意向共享锁和意向排他锁,是行数和表锁的结合
  • 共享锁
    • 允许多个事务同时读取数据,但是不能修改,锁释放后才能获得排他锁
  • 排它锁
    • 只允许一个事务进行读写,其他事务不能访问该资源
  • 元数据锁
    • 对数据库对象(如表或索引)的元数据的一种保护,防止修改DDL时,其他事务对这些对象进行修改。
  • 间隙锁
    • 对两个数据间进行加锁,防止其他事务在这个间隙插入数据
  • 临间锁(next-key lock)
    • 行锁和间隙锁的结合,锁定具体行和前面的间隙,常用于可重复读
  • 插入意向锁
    • 一种等待间隙的锁,表示打算在这个间隙插入数据,其他事务可以读取,但是不能插入数据
  • 自增锁
    • 保证自增ID唯一

死锁

发生死锁怎么办

  • MySQL会自动检测,发现死锁会回滚其中一个事务,用来解除死锁。通常回滚资源最少的那个事务
  • 手动结束某个死锁线程,释放资源
    • SHOW ENGINE INNODB STATUS; 找到线程ID
    • KILL 线程ID; 手动执行命令

怎么优化

  • 避免大事务
  • 调整申请锁的顺序
  • 更改事务的隔离级别
  • 合理建立索引
  • 开启死锁检测