对于select查询,获取的读取锁是哪些行?是仅与过滤器匹配的行,还是必须扫描的所有行?
答案 0 :(得分:0)
首先,请注意只有读写事务才需要锁,但只读事务需要锁。 (https://cloud.google.com/spanner/docs/reads)
Cloud Spanner将获取所有返回行的锁定。它还将获取足够的额外锁定以避免“错误否定”,这些行是因为它们最初与过滤器不匹配而未返回的行,但随后会在事务提交之前进行修改以匹配过滤器。这些漏报通常被称为“幻像行:”您执行查询并获取一组结果,然后在同一事务中执行完全相同的查询并获得更多行。如果查询计划对基表进行扫描,我们将对整个表进行范围锁定,以便在事务完成之前不会出现幻像行。如果查询计划使用索引查找字段'Y'的值为'X'的行,那么我们将锁定与'Y = X'的所有可能索引条目对应的索引范围,以便如果任何事务需要要插入一个带有'Y = X'的新索引条目,它必须等到你的交易完成。