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
查询设置的锁都会被释放。