【mysql】表锁、行锁、意向锁、间隙锁

140 阅读2分钟

概念

表锁

  • 表锁是最粗粒度的锁,它锁定整个数据库表,而不是表中的特定行或数据。
  • 当一个事务获取了一个表锁时,其他事务将无法访问整个表,直到持有表锁的事务释放它。
  • 表锁适用于少量并发访问表的情况,通常不建议在高并发环境下使用,因为它会导致性能瓶颈和阻塞。

行锁

  • 行锁是更细粒度的锁,它允许事务锁定表中的特定行或一组行,而不是整个表。
  • 不同的事务可以同时锁定不同行,因此行锁更适合高并发的情况
  • 行锁通常会在读取和修改行数据时使用,以防止其他事务同时修改相同的行。

意向锁

  • 意向锁是一种辅助锁,用于指示事务将在表或行上放置锁。
  • 当一个事务在行上放置了行锁时,会发出一个意向锁,告诉其他事务它打算在该表上放置锁。
  • 意向锁有两种类型:意向共享锁(IS)和意向排他锁(IX)。

间隙锁

  • 间隙锁是行级锁的一种,它用于锁定范围内的行,而不仅仅是单个行。

  • 间隙锁可以用来防止其他事务在范围内插入新行,从而避免幻读问题。当一个事务读取一个范围内的行时,其他事务不能在该范围内插入新行。

应用场景

  • 表锁适用于稀少的写操作和大量的读操作的情况。例如,在只读取数据的报表生成系统中可以使用表锁。

  • 行锁适用于高并发的系统,其中多个事务需要并发访问同一表中的不同行。例如,在在线销售系统中,多个用户可以同时浏览和购买不同的商品

  • 意向锁用于协调并发事务的锁定操作,以防止冲突和死锁。它们通常不直接由开发人员管理,而由数据库管理系统自动处理

  • 间隙锁通常用于解决幻读问题,幻读是指在事务执行期间,另一个事务插入了新行,导致第一个事务看到了事务开始时不存在的数据。通过使用间隙锁,数据库可以锁定范围,防止其他事务插入新的行,从而解决幻读问题