MySQL中InnoDB锁的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
1只;共享和专用锁
共享锁(译:共享锁)
互斥型锁(译:排它锁,独占锁)
InnoDB实现了标准的行级锁,其中有两种类型的锁,共享锁(共享锁)和排他锁(专用锁)。
一个共享锁(S)允许持有锁的事务读取一行。
独占(X)锁允许持有锁的事务更新或删除一行。
引用>共享锁允许持有该锁的事务读取一行。
排它锁允许持有该锁的事务更新或删除行。
如果事务T1持有行r上的共享锁,那么来自不同事务T2的请求将按照以下方式处理:,
<李>
T2对S锁的请求可以立即被授予。结果就是,T1和T2在行r上都持有锁。
李> <李>T2对X锁的请求不能立即被授予。
李>如果事务T1持有行r上的排它锁(X),那么来自不同事务T2的请求不能立即被授予r上任何一种类型的锁。相反,事务T2必须等待事务T1释放其在r行上的锁。
2只;意向锁
意图锁(译:意向锁)
InnoDB支持多粒度锁,允许行锁和表锁共存。例如,诸如锁表……写之类的语句对指定表采用排它锁(X锁)为了在多个粒度级别上实现锁,InnoDB使用了意向锁。意向锁是表级锁,它指示事务稍后需要对表中的一行使用哪种类型的锁(共享锁或者排它锁)只
有两种类型的意向锁:
<李>
意向共享锁(是)表示事务打算在表中的单个行上设置共享锁。
李> <李>意向排他锁(IX)表示事务打算在表中的单个行上设置排它锁。
李>
例如,选择…锁定共享模式设置一个锁,选择…更新设置一个IX锁。
意向锁的协定是这样的:
在事务获得表中某一行的共享锁之前,它必须首先获得表上的是锁或更强锁。
在事务获得表中某一行的排它锁之前,它必须首先获得表上的第九锁只
表级锁类型兼容性如下图:
![]()
如果一个锁与现有锁兼容,则将其授予请求的事务,但如果与现有锁冲突,则不授予该锁。事务等待,直到冲突的现有锁被释放。如果一个锁请求与一个现有的锁冲突,并且因为它会导致死锁而不能被授予,那么就会发生错误。
意向锁除了全表请求(例如锁表……写)外,不阻止任何其他内容。意图锁定的主要目的是表明某人正在锁定表中的行或要锁定表中的行。
3只;记录锁
记录锁(译:记录锁)
记录锁锁> SELECT *,得到child WHERE id =, 100;
如果id列没有索引或者有一个非唯一索引,则该语句会锁定前面的间隙。
这里还值得注意的是,不同的事务可以在一个间隙上持有冲突的锁。
例如,事务一个可以在一个间隙上持有一个共享间隙锁(s锁的差距),而事务B在同一个间隙上持有一个排他间隙锁(差距独占锁)。允许冲突间隙锁的原因是,如果一条记录从一个索引中被清除,那么记录上由不同事务持有的间隙锁必须被合并。
InnoDB中间隙锁的唯一目的是防止其他事务插入间隙。间隙锁可以共存。一个事务取得的间隙锁并不会阻止另一个事务取得同一间隙上的间隙锁。共享和独占间隔锁之间没有区别。它们彼此之间不冲突,并且执行相同的功能。
5只;第二个关键锁
,第二个关键锁是记录锁的组合>(无穷,negative 10) (10,11] (11日,13) (13日,20) (20,positive ∞)
默认情况下,InnoDB使用可重复读事务隔离级别。在这种情况下,InnoDB使用键锁进行搜索和索引扫描,以阻止幻象行。
6只;插入锁意图
插入意图锁(译:插入意向锁)
插入意向锁是一种间隙锁,是由插入操作在行插入之前设置的。这个锁表示,如果多个事务插入到同一个索引间隙中,如果它们没有插入到这个间隙中的同一位置,那么它们就不需要等待对方。假设有值为4和7的索引记录。尝试插入值分别为5和6的独立事务,在获得插入行的排他锁之前,每个事务都用插入意向锁锁住4和7之间的间隙,但不会阻塞彼此,因为行是不冲突的。
7只;
AUTO-INC AUTO-INC锁锁是一种特殊的表级锁,由插入到带有AUTO_INCREMENT列的表中的事务获得。在最简单的情况下,如果一个事务正在向表中插入值,那么任何其他事务都必须等待自己对该表的插入,以便由第一个事务插入的行接收连续的主键值。
MySQL中InnoDB锁的作用是什么