【MySQL 进阶之路】表级锁、行级锁详解

发布于:2024-12-08 ⋅ 阅读:(97) ⋅ 点赞:(0)

1. 表级锁和行级锁的概念及区别

表级锁(Table Lock)

表锁是一种较为粗粒度的锁,锁定的是整个表。当某个事务加锁表时,其他事务对该表的任何读写操作都会被阻塞,直到锁被释放。因此,表锁具有较高的冲突概率,尤其是在高并发的环境中。表锁的主要优点是操作简单,适用于表数据量较小且并发请求较少的场景。

  • 共享锁(S锁):读锁,只会阻塞写操作,允许其他事务读取。
  • 排他锁(X锁):写锁,会阻塞其他事务的读写操作,确保独占访问。

表级锁的特点

  • 适用于低并发的应用场景,操作简单。
  • 会在事务执行期间锁住整个表,限制了其他事务的并发执行。
  • 可能导致性能瓶颈,尤其在大规模并发时。

意向锁(Intention Lock)

意向锁是InnoDB存储引擎中引入的一种特殊锁,目的是为了避免行锁与表锁之间的冲突。意向锁并不直接锁定某一行数据,而是标记某个事务打算在某一表上加行锁。

意向锁的类型

  • 意向共享锁(IS锁):表示事务打算对某些行加共享锁(S锁)。它与表锁的共享锁(S锁)兼容,但与表锁的排他锁(X锁)互斥。
  • 意向排他锁(IX锁):表示事务打算对某些行加排他锁(X锁)。它与表锁的共享锁(S锁)和排他锁(X锁)都互斥,但意向锁之间不会互斥。

意向锁的作用

  1. 提高锁的效率:通过在表级别设置意向锁,减少了在查询表级锁时的冲突检查。例如,当一个事务打算对某些行加排他锁时,通过设置意向排他锁(IX锁),可以让其他事务在请求表级锁时知道当前事务的锁意图,从而避免不必要的冲突。
  2. 避免表锁和行锁之间的冲突:表级锁和行级锁在同一时刻无法兼容,通过意向锁,InnoDB能够减少每次获取表级锁时对每一行的锁状态进行检查,从而提高效率。
  3. 支持高并发:意向锁使得事务可以更加高效地执行数据操作,在加行锁的同时不必对整个表加锁,减少了并发的阻塞。

意向锁的示例

  • 当事务A对表进行操作,并且打算对某些行加排他锁时,首先会在表上设置一个意向排他锁(IX锁)。如果其他事务也想对表加排他锁,它们必须等待事务A完成并释放锁。
  • 如果事务B希望在该表上加一个共享锁(S锁),但事务A已经加了意向排他锁(IX锁),那么事务B会被阻塞,直到事务A释放锁。

行级锁(Row Lock)

行锁是一种较为细粒度的锁,它锁定的是某一行或一组行的数据,允许多个事务并发访问同一表中的不同数据行。行锁能有效减少冲突,但相应地会增加锁管理的开销。行锁通常与索引一起使用,以实现对某一特定数据行的锁定。

  • 共享锁(S锁):在行级别加共享锁,允许其他事务读取该行,但阻止写入。
  • 排他锁(X锁):在行级别加排他锁,禁止其他事务对该行的读取和写入。

行级锁的特点

  • 适用于高并发的环境,能提高数据访问的并发性。
  • 比表锁更细粒度,锁定范围小,减少冲突。
  • 需要使用索引以提高锁的效率,否则会出现全表扫描,导致性能下降。

表级锁与行级锁的区别

特性 表锁 行锁
锁粒度 锁定整个表 锁定特定的行或数据块
并发性 并发性差,可能会阻塞大量操作 并发性高,能够实现对不同数据行的并发操作
锁管理开销 较低,操作简单 较高,需要更多的资源和管理
性能 在低并发环境下性能较好 在高并发环境下表现更好
适用场景 数据量小,事务量少的情况 数据量大,事务量高的情况

网站公告

今日签到

点亮在社区的每一天
去签到