MySQL锁合集

概览

在数据库管理中,锁是用来控制多个事务对同一数据的并发访问的机制。InnoDB作为MySQL的默认事务型存储引擎,提供了多种类型的锁来保障事务的隔离性并减少冲突,从而维护数据库的完整性和一致性。以下是InnoDB提供的主要锁类型:

  1. 共享锁(S 锁)
    共享锁允许一个或多个事务读取同一数据行,并阻止其他事务在此数据行上获取排他锁。这种锁是协作型的,使得多个读操作可以不受干扰地同时发生。

  2. 排他锁(X 锁)
    排他锁是比共享锁更严格的锁,当事务持有排他锁时,它可以对数据行进行更新操作。其他事务不能读取或写入这个已被排他锁保护的数据行,直到锁被释放。

  3. 意向共享锁(IS 锁)
    意向锁是InnoDB用来表明事务意图在表的某些行上设置共享锁的方式。当事务打算在表中的多行上设置共享锁时,它首先会在表级别上设置意向共享锁。

  4. 意向排他锁(IX 锁)
    类似意向共享锁,意向排他锁表明事务打算在表的一行或多行上设置排他锁。它是一个表级锁,允许事务显示其对数据行的未来排它锁定的意图。

  5. 记录锁
    记录锁是最精细级别的锁,它直接作用于表中的单个记录。这种锁类型用于控制对具体一行数据的读写操作,通常与其他锁类型结合使用,以实现更高的并发性。

  6. 间隙锁
    间隙锁用于锁定一组记录的间隙,也就是两个索引记录之间的范围。这种锁防止其他事务在间隙范围内插入新行,是InnoDB间隙锁定策略的一部分。

  7. Next-Key锁
    Next-Key锁结合了记录锁和间隙锁的特性,锁定一个索引记录以及该记录前的间隙。这种锁是InnoDB中默认的锁类型,旨在防止幻读现象。

  8. 插入意向锁
    当事务准备插入新行时,它会先设置插入意向锁。这个锁与其它事务的插入意向锁是兼容的,但与在相同位置的其他类型锁冲突,用于在插入时维持间隙锁的正确性。

  9. AUTO-INC锁
    AUTO-INC锁是一种特殊类型的锁,在事务插入新值到带有AUTO_INCREMENT属性的列时使用。这个锁确保新生成的自动增长值的唯一性和连续性。

锁列表

  1. 共享锁(S 锁): 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁
  2. 排他锁(X 锁): 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁
  3. 意向共享锁(IS 锁): 表明一个事务打算在表中的行上设置 S 锁
  4. 意向排他锁(IX 锁): 表明一个事务打算在表中的行上设置 X 锁
  5. 记录锁: 用于锁定表中的行
  6. 间隙锁: 用于锁定表中的一个“间隙”,用以防止并发的插入操作
  7. Next-Key锁: 锁定一个索引记录与该记录之前的“间隙”,即锁定的是该键值的前闭后开区间
  8. 插入意向锁: 当InnoDB插入一行时,它会先在被插入的位置设置一个插入意向锁,这意味着这个事务打算插入一行
  9. AUTO-INC锁: 在插入AUTO_INCREMENT列的新值时使用

事务隔离级别和锁关系

事务隔离级别 使用的锁类型 不使用的锁类型 脏读 幻读 不可重复读 原因
读未提交 (Read Uncommitted) 排他锁(X锁) 共享锁(S锁), 间隙锁, Next-Key锁, 意向共享锁(IS锁), 意向排他锁(IX锁) 高并发,最低级别的数据隔离,直接读取数据库中无论是否提交的数据。
读提交 (Read Committed) 排他锁(X锁), 记录锁 间隙锁, Next-Key锁 防止脏读,只能读取提交后的数据,但事务内部的多次读取可能见到不同数据。
可重复读 (Repeatable Read) 共享锁(S锁), 排他锁(X锁), Next-Key锁, 插入意向锁 间隙锁(可选) 默认级别,保证事务内可见数据的一致性,防止幻读和不可重复读。
可序列化 (Serializable) 共享锁(S锁), 排他锁(X锁), 意向共享锁(IS锁), 意向排他锁(IX锁), 表级锁 间隙锁(可能) 最高级别的数据隔离,加锁防止所有事务并发,确保数据一致性。

解释:

  • 脏读:读取到其他未提交事务中的数据。
  • 幻读:在一个事务内读取时,因为其他并发事务的插入操作,一次查询和下一次查询的结果集不一致。
  • 不可重复读:在同一个事务内,多次读取同一数据集合时,因其他事务的修改操作导致后续读取的结果与起始读取不同。

总结

想象你一下,你使用Spring声明式事务@Transactional,然后在代码中各种使用Feign/RestTemplate/WebClient进行内部和外部调用,你想想你的数据库是什么感受。它就各种锁锁锁,然后业务就各种DeadLock,DeadLock。

滚动至顶部