google-cloud-firestore - 基于不存在文档的 Firestore 事务(集合级别锁定不可用)

标签 google-cloud-firestore database-concurrency

基于 this所以回答我开始知道 firestore 在事务中没有集合级别锁定。 就我而言,在写入集合之前,我必须确保用户集合中的用户名字段是唯一的。 为此,我编写了一个执行此操作的事务:

  1. 对 users 集合执行查询以检查是否存在 username=something 的文档
  2. 如果确实存在,则失败并从交易中返回错误
  3. 如果它不存在,只需为我要更新/创建的用户 ID 运行写入操作。

现在这里的问题是,如果两个客户端同时尝试运行此事务,则两个客户端都可能查询集合,并且由于集合未锁定,一个客户端可能会插入/更新集合中的文档,而另一个客户端将看不到它。

我的假设是否正确?如果是,那么如何处理这种情况?

最佳答案

您尝试执行的操作实际上不可能以原子方式执行,因为无法在无法使用 ID 识别的文档上安全地进行交易。这里的问题是,只有您可以get() 要添加或修改的特定文档时,事务才“安全”。由于您无法使用文档中的字段值get() 文档,因此您不知所措。

如果您想确保 Firestore 中任何内容的唯一性,则需要将该唯一性编码到文档 ID 本身中。在最简单的情况下,您可以使用用户名作为新集合中文档的 ID。如果这样做,您的事务可以简单地通过用户名get() 所需的文档,检查它是否存在,如果不存在则写入文档。否则,交易可能会失败。

请记住,因为有 limitations为了在 Firestore 中记录 ID,如果您的用户名可能违反规则,您可能需要对该用户名进行转义或编码。

关于google-cloud-firestore - 基于不存在文档的 Firestore 事务(集合级别锁定不可用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63250390/

相关文章:

java - 无法在 Firestore 中禁用离线数据

javascript - 如何在 Firestore JS 中获取现有的文档 key ?

python - 运行并发请求时获取 "Invalid cursor state (0)"(SQLAlchemy & wsgi/python)

database - PostgreSQL - MVCC(多版本并发控制) - 何时获取实际锁?

php - 时间戳困惑 : solution for concurrency issue

android - 如何将json firestore时间戳序列化为日期?

firebase - 在 flutter 中使用 withConverter 获取 Firestore 文档引用字段的数据

firebase - 如何在使用 IMPORTRANGE 的 Google 表格中将持续时间转换为秒

java - 用于 REST 服务的单个 MySql 数据库连接