能不能通俗的解释下为什么要有意向锁这个东西?

1 个回答

  • 李牧炎
    努力的最大意义,是你可以选择生活。而不是被生活选择。
    ### 为什么要有意向锁? 在数据库中,InnoDB 支持两种锁:**行锁**和**表锁**。行锁允许对表的特定行加锁,表锁则可以对整个表加锁。MySQL 需要协调这两种类型的锁,以避免冲突并提高锁定操作的效率。 #### 问题背景: 1. **事务 A** 申请了某行的**行级读锁**,即只锁住表中的一行,允许对该行进行读取,但禁止其他事务对该行进行写操作。 2. **事务 B** 尝试申请**表级写锁**,即锁住整个表,允许对表中的所有行进行读写。 ![image.png](https://images.codewd.com/2bb47fff75a86dd8bb7647c2843003c1.jpg "image.png") 如果允许事务 B 的表级写锁申请成功,那么它将可以修改表中的任意一行,这与事务 A 对某行加的行级读锁是冲突的。因此,数据库必须阻塞事务 B,直到事务 A 释放对那一行的行级锁。 #### 原有方案的问题: 为了判断是否存在锁冲突,数据库需要执行以下步骤: 1. 判断是否有其他事务对表加了表级锁。 2. 判断表中的每一行是否被行级锁锁住。 但**遍历表中所有行来判断行级锁的状态**显然效率极低,特别是在大表的情况下。 #### 意向锁的引入: 为了解决这个低效问题,**意向锁**应运而生。 意向锁是表级别的锁,表示一个事务计划在表的某些行上加锁。它们帮助数据库快速判断锁定状态,无需逐行遍历。 ##### 两种意向锁: 1. **意向共享锁(IS 锁)**:当事务想要对表的某些行加**共享锁**(行级读锁)时,InnoDB 自动为该表加一个意向共享锁。 2. **意向排他锁(IX 锁)**:当事务想要对表的某些行加**排他锁**(行级写锁)时,InnoDB 自动为该表加一个意向排他锁。 #### 意向锁的工作机制: 1. **事务 A** 想要申请行级读锁时,InnoDB 会先自动申请表的意向读锁(IS 锁),申请成功后再继续对具体的行加读锁。 2. **事务 B** 试图申请表级写锁时,发现表上已有意向读锁(IS 锁),表明表中某些行已经被加了行级读锁。因此,表级写锁与意向读锁互斥,**事务 B 的写锁申请会被阻塞**。 ![image.png](https://images.codewd.com/247c8a6d67e2cf187cb0ae2cf7ac9b49.jpg "image.png") 通过意向锁,数据库可以跳过逐行遍历,直接根据表上的意向锁状态,判断是否存在行级锁,从而大幅提升锁定操作的效率。 ### 总结: 意向锁的作用就是简化锁冲突的判断。在有意向锁的情况下,数据库不需要逐行遍历表来判断是否有行级锁,而是直接检查表上是否有意向锁。
    发布于 2024-09-23 19:59 •IP属地 海南
    举报
    评论
    收藏