从图书馆借书看MySQL意向锁的工作原理

201 阅读3分钟

了解意向锁之前,先了解MySQL的锁类型与锁机制:全面解析:数据库锁类型、策略及优缺点一览

什么是意向锁?

意向锁是MySQL数据库中一种机制,用于协调“行级锁”“表级锁”之间的冲突和并发问题。它的核心目的是提高数据库的并发性能,确保多个事务可以尽量高效地访问共享资源,而不会因为锁的粒度不同(行锁 vs 表锁)导致不必要的阻塞或冲突。


通俗解释:

假设有一间图书馆,里面放满了书架,每个书架上有很多书。图书馆允许:

  • 有人“借一整排书架”(表级锁)。
  • 有人只“借其中一本书”(行级锁)。

问题:

  • 如果没有一种机制来提前标记一个人想借书的意图,那么可能会导致混乱。
  • 例如:一个人正在挑选一本书(行级锁),另一个人突然提出要借整个书架(表级锁)。这就可能出现冲突,甚至需要重新协调资源的使用。

解决方案: 意向锁就像是一种“标记”,提前告诉别人某人可能要借书或者书架:

  • 意向共享锁(IS,Intent Shared Lock):某人告诉图书馆管理员“我可能会取某个书架上的一本书”(即即将设置读锁)。
  • 意向排他锁(IX,Intent Exclusive Lock):某人告诉管理员“我可能会独占某个书架”(即即将设置写锁)。

通过这种机制,管理员(数据库)可以快速判断是否允许某人借书(获取锁),从而避免不必要的冲突。


意向锁的特点

  1. 表级锁:意向锁本质上是针对表的,而不是具体的行。它用于标记事务的意图,而不会直接锁定具体的行或表。
  2. 两种类型
    • 意向共享锁(IS):事务准备对某些行加“共享锁”(读锁)。
    • 意向排他锁(IX):事务准备对某些行加“排他锁”(写锁)。
  3. 自动获取:当事务试图对某一行加锁时,MySQL会自动生成相应的意向锁,而不需要开发者手动干预。
  4. 保护并发性:通过意向锁,MySQL可以更高效地判断是否能授予某事务访问权限,而不会因锁冲突导致性能下降。
  5. 事务结束后释放:意向锁会在事务提交或回滚后自动释放,不需要手动解锁。

工作流程

  1. 获取意向锁:事务在对行操作之前,首先会尝试获取对应表的意向锁。
  2. 检查冲突:MySQL会检查当前的意向锁与其他已有锁是否冲突。
  3. 设置行锁或表锁:在确认没有冲突后,事务可以对具体的行或表加锁。

思维导图

以下是关于意向锁工作机制的简单思维导图,帮你更好地理解:

image.png


总结

意向锁的引入解决了“行锁”和“表锁”之间的冲突问题,提高了数据库的并发性能。它通过一种“提前声明”的方式,让MySQL能够快速判断是否允许加锁,从而避免不必要的阻塞或死锁。