据我所知,gap锁是用来防止幻影读取的,我发现gap锁是通过Google搜索在大多数文章中通过锁定读取来设置的。
gap锁是索引记录之间的间隙锁,或者是在第一个或最后一个索引记录之后的间隙锁。例如,从t选择c1,c1在10到20之间进行更新;阻止其他事务将值15插入列t.c1,无论列中是否已经存在此类值,因为范围中的所有现有值之间的差距被锁定。
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-gap-locks
我想这个(锁定读时设置间隙锁)就足够了。为什么更新,删除也设置间隙锁。
更新..。在哪里..。在搜索遇到的每一条记录上为设置一个独占的下键锁。但是,对于使用唯一索引锁定行以搜索唯一行的语句,只需要索引记录锁。
https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html
另一个问题是,如果没有合适的索引可以连接间隙锁,那么会发生什么情况?会倒回去锁在整张桌子上吗?
在这里,我们假设使用默认事务隔离级别可重复读取。
发布于 2020-03-26 17:19:10
这取决于选择、更新或删除中的条件。它们设置间隙锁,以防止其他并发会话向集合中添加将由条件匹配的行。
在InnoDB中,锁定语句总是锁定最近提交的行版本。因此,它们并不真正遵守可重复读取快照。他们表现得更像读书。
因此,如果您执行这样的语句:
UPDATE FROM MyTable SET ... WHERE created_at > '2020-03-22';它必须按照created_at的最高值锁定空白,这将阻止其他会话添加新行。
这是为了模拟可重复读取,以确保如果再次运行相同的更新,它将影响相同的行,并且不会意外地影响新的行。
https://stackoverflow.com/questions/60863741
复制相似问题