【发布时间】:2021-01-18 21:26:24
【问题描述】:
如果一个事务读取了 3 个文档,然后成功更新了 2 个文档,但之后的某些事情导致事务失败...即使回滚了 3 次读取和 2 次写入,我是否需要付费?
编辑---
下面的 get() 是否也只需读取 1 次?其中 col2 是 doc1 的子集合。
db.collection('col1').doc('doc1').collection('col2').doc('doc2').get();
编辑 2
firebase 网站声明如下
例如,如果一个事务读取了文档,而另一个客户端修改了这些文档中的任何一个,Cloud Firestore 就会重试该事务。此功能可确保事务在最新且一致的数据上运行。
假设我的事务对 10 个不同的文档执行了 10 次读取。如果这被调用并且在执行期间其他用户更新了一些相同的文档,这将使事务重试,我是否会遇到 10 * Number of retries for my reads?
编辑 3
我在https://firebase.google.com/docs/firestore/transaction-data-contention 阅读了有关交易的更多信息,它指出服务器端交易将锁定文档并等待交易完成。
q1) 由于事务处于锁定状态并且不会一遍又一遍地重试...是否会对具有事务的 firebase 函数进行多次并发调用而不会花费任何额外的读/写,并且这些函数是否会因为锁?
q2) 网页底部还有一个横幅说明
注意:只有服务器客户端库支持写操作后读操作的事务。对于移动/网络 SDK 中的事务,文档读取必须在文档写入之前进行。
我刚刚在我的 firebase 函数上尝试过这个并收到以下错误...
Error: Firestore transactions require all reads to be executed before all writes.
at Transaction.get (/srv/node_modules/@google-cloud/firestore/build/src/transaction.js:76:19)
我正在使用 firebase 管理版本“^8.8.0”,是否在写入后执行读取,这是在较新版本中添加的功能?
【问题讨论】:
-
问题有点含糊,因为您提到了Firebase Transaction,这意味着要么保存事务中的所有数据,要么整个事务失败。因此,您所描述的实际上不会发生,就好像任何部分都失败了,整个交易都失败了。见Failed Transaction
-
我看到了,但它没有提及交易失败前它所做的操作的定价。我会用更多细节更新我的问题
-
这不是一个坏问题,但对 SO 来说可能不是一个好问题。我认为这更像是一个计费问题,而不是一个编码问题,应该直接联系 Firebase 支持。
-
是的,也许吧,希望我能从这里的一些 Firebaser 那里得到一些澄清。我已更新以提供更多详细信息,这会有所帮助
-
@jay 我再次更新了问题...错过了文档中的一整页
标签: firebase google-cloud-firestore