Cloud Firestore 数据存储模式 - 没有综合索引的事务争用
Cloud Firestore Datastore Mode - Transaction Contention without Composite Index
在我目前正在开发的一个应用程序中,我们需要确保特定种类的三个属性的元组的唯一性。因此,在创建新实体时,我们需要确保不存在具有给定元组的那种实体。
我对这个问题的幼稚方法是创建一个简单的查询,该查询根据三个字段的相等性进行过滤。如果找到具有给定字段的实体,则操作将中止,否则将插入具有这些字段和其他相关数据的新实体。但是,当尝试并行插入多个实体时,会出现事务争用。
但是,一旦我添加了这三个属性的复合索引,就不会发生争用。我在代码中什么都没有改变,我只是为这些字段添加了一个复合索引。
我一直在翻阅所有文档并四处搜索任何遇到过类似问题的人,但没有人提到过这个“解决方法”。
我错过了什么吗?也许发现了什么?或者这是预期的行为;内置索引还不够吗?
您要查看的主要文档是 https://cloud.google.com/datastore/docs/concepts/optimize-indexes。
在您的情况下,看起来您的合并联接最终在查找不匹配项时锁定了多行。但是,使用复合索引,您只需查找查询所需的索引条目。因此,与使用合并连接查询相比,复合索引的争用更少。
在我目前正在开发的一个应用程序中,我们需要确保特定种类的三个属性的元组的唯一性。因此,在创建新实体时,我们需要确保不存在具有给定元组的那种实体。
我对这个问题的幼稚方法是创建一个简单的查询,该查询根据三个字段的相等性进行过滤。如果找到具有给定字段的实体,则操作将中止,否则将插入具有这些字段和其他相关数据的新实体。但是,当尝试并行插入多个实体时,会出现事务争用。
但是,一旦我添加了这三个属性的复合索引,就不会发生争用。我在代码中什么都没有改变,我只是为这些字段添加了一个复合索引。
我一直在翻阅所有文档并四处搜索任何遇到过类似问题的人,但没有人提到过这个“解决方法”。
我错过了什么吗?也许发现了什么?或者这是预期的行为;内置索引还不够吗?
您要查看的主要文档是 https://cloud.google.com/datastore/docs/concepts/optimize-indexes。
在您的情况下,看起来您的合并联接最终在查找不匹配项时锁定了多行。但是,使用复合索引,您只需查找查询所需的索引条目。因此,与使用合并连接查询相比,复合索引的争用更少。