首页 > 解决方案 > 当对表的写入触发创建或更新二级索引行时,这算作回填吗?

问题描述

根据这里的答案

https://stackoverflow.com/a/62524395/1060314

回填期间不允许读取/查询索引本身。但允许写入原始表。新的写入同时添加到索引中。回填后,Spanner 将确保在查询时仅显示最新数据。

所以问题是,在回填过程完成后,索引的更新是否会被视为类似的回填保护?

例如:如果我将行 Z 添加到现有表,并且该表有一个二级索引,该二级索引已经完成了我的新行 Z 符合索引的正式回填过程,则在 spanner 选择写入直到它的时间写入索引,索引是否处于该backfill状态?还是仅在现有表的初始索引填充期间回填状态?

有可能我们写了一行,然后在该行实际进入索引之前,另一个进程尝试查询索引,该查询是否会因回填错误而停止:

索引 <index_name> 无法使用,因为它处于回填状态

标签: google-cloud-spanner

解决方案


所以问题是,在回填过程完成后,索引的更新是否会被视为类似的回填保护?

例如:如果我将行 Z 添加到现有表,并且该表有一个二级索引,该二级索引已经完成了我的新行 Z 符合索引的正式回填过程,则在 spanner 选择写入直到它的时间写入索引,索引是否被认为处于回填状态?还是仅在现有表的初始索引填充期间回填状态?

不,回填仅在首次创建索引时发生,并且仅处理直到创建时间戳的更新。这种类型为索引中的值应该是什么设置了基线。

此时间戳之后的新更新,无论是在回填完成之前还是之后,都将由正常的索引更新过程处理。注意:在内部,Spanner 确实在回填期间以稍微不同的方式处理更新以避免争用,但这是实现细节。

有可能我们写了一行,然后在该行实际进入索引之前,另一个进程尝试查询索引,该查询是否会因回填错误而停止:

不会。对索引的更新与对表的更新一起提交。在您的示例中,不应该有任何错误,如果读取发生在提交成功之前,读者将看到旧值,否则会看到新值。


推荐阅读