基于 this所以回答我开始知道 firestore 在事务中没有集合级别锁定。 就我而言,在写入集合之前,我必须确保用户集合中的用户名字段是唯一的。 为此,我编写了一个执行此操作的事务:
- 对 users 集合执行查询以检查是否存在 username=something 的文档
- 如果确实存在,则失败并从交易中返回错误
- 如果它不存在,只需为我要更新/创建的用户 ID 运行写入操作。
现在这里的问题是,如果两个客户端同时尝试运行此事务,则两个客户端都可能查询集合,并且由于集合未锁定,一个客户端可能会插入/更新集合中的文档,而另一个客户端将看不到它。
我的假设是否正确?如果是,那么如何处理这种情况?
最佳答案
您尝试执行的操作实际上不可能以原子方式执行,因为无法在无法使用 ID 识别的文档上安全地进行交易。这里的问题是,只有您可以get()
要添加或修改的特定文档时,事务才“安全”。由于您无法使用文档中的字段值get()
文档,因此您不知所措。
如果您想确保 Firestore 中任何内容的唯一性,则需要将该唯一性编码到文档 ID 本身中。在最简单的情况下,您可以使用用户名作为新集合中文档的 ID。如果这样做,您的事务可以简单地通过用户名get()
所需的文档,检查它是否存在,如果不存在则写入文档。否则,交易可能会失败。
请记住,因为有 limitations为了在 Firestore 中记录 ID,如果您的用户名可能违反规则,您可能需要对该用户名进行转义或编码。
关于google-cloud-firestore - 基于不存在文档的 Firestore 事务(集合级别锁定不可用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63250390/