14.7.2.4 锁定读取 SELECT … FOR UPDATE [悲观锁]

14.7.2.4 锁定读取

如果查询数据然后在同一个事务中插入或更新相关数据,正则SELECT 语句就没有提供足够的保护。其他事务可以更新或删除您刚刚查询的相同行。 InnoDB支持两种类型的 锁定读取,提供额外的安全性:

  • SELECT ... LOCK IN SHARE MODE在读取的任何行上设置共享模式锁。其他会话可以读取这些行,但在您的事务提交之前无法修改它们。如果这些行中的任何一行被另一个尚未提交的事务更改,您的查询将等到该事务结束,然后使用最新值。
  • SELECT ... FOR UPDATE对于搜索遇到的索引记录,锁定行和任何关联的索引条目,就像您UPDATE为这些行发出 语句一样。其他事务被阻止更新这些行、执行SELECT ... LOCK IN SHARE MODE或读取某些事务隔离级别的数据。一致读取忽略对读取视图中存在的记录设置的任何锁定。(旧版本的记录不能被锁定;它们是通过在记录的内存副本上应用撤消日志来重建的 。)

这些子句主要在处理树结构或图结构数据时有用,无论是在单个表中还是拆分到多个表中。您可以从一个地方遍历边缘或树枝到另一个地方,同时保留返回并更改这些“指针”值中的任何一个的权利 。

当事务提交或回滚时, 所有由LOCK IN SHARE MODE和 FOR UPDATE查询设置的锁都会被释放。