- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 @google-cloud/firestore 的 Node.js 应用程序,它有两个集合,A 和 B。
Collection A 文档有一个名为“name”的字段和一个名为“collectionBId”的字段。集合 B 文档只有一个名为“名称”的字段。集合 A 和 B 中的名称是唯一的。
// Collection A
{ id: 1, name: 'example1', nameB: 'example2' }
// Collection B
{ id: 1, name: 'example2' }
Node.js 中有一个端点可以:
const result = await firestore.runTransaction(async transaction => {
const refA = firestore.collection('A').where('name', '==', reqParam1)
const {docs: docsA} = await transaction.get(refA)
const refB = firestore.collection('B').where('name', '==', docsA[0].data().name).where('name', '==', reqParam2)
const {docs: docsB} = await transaction.get(refB)
return docsB[0].data()
})
这明显快于(少了一次往返):
const {docs: docsA} = await firestore.collection('A').where('name', '==', reqParam1).get()
const {docs: docsB} = await firestore.collection('B').where('name', '==', docsA[0].data().name).where('name', '==', reqParam2).get()
const result = docsB[0].data()
事务在 Node.js 中以悲观锁运行,但不清楚多个用户是否可以同时使用此事务(例如 100 个用户)。
在文档中提到,当执行写入时,会有一个锁定来阻止并发写入是否也会阻止读取?另外,如果大量使用读取事务,是否会阻止写入?
这导致了以下两个问题:
最佳答案
(最终?)编辑 4:github issue被标记为已修复并且文档将被更新,所以现在我们知道交易是如何进行的 work :
You can use the transaction object passed to
updateFunction
to read and modify Firestore documents under lock. You have to perform all reads before before you perform any write.
Documents read during a transaction are locked pessimistically. Atransaction lock on a document blocks other transactions, batchedwrites, and other non-transactional writes from changing that document.A transaction releases its document locks at commit time or once it timesout or fails for any reason.
Transactions are committed once
updateFunction
resolves. If a transaction fails with contention, the transaction is retried up to five times. TheupdateFunction
is invoked once for each attempt.
Transactions timeout after 60 seconds if no documents are read. Transactions that are not committed within than 270 seconds are also aborted.
编辑 3a:我从 Github repo 找到了更多关于交易的“官方”信息:
If you are reading a document using the runTransaction() API via a Server SDK the backend will prevent other clients from modifying the document until the transaction is committed. This lock can be held for up to 270 seconds. We refer to this as "pessimistic locking" in our documentation and all Firestore Server SDK expose these semantics.
There are some rare cases when the backend aborts currently runningtransactions (e.g. if there is too much contention), in which case allSDKs will retry, independent of how locks were obtained.
If you have two transactions running that both try to read the samedocument, the first one will succeed and the second one will hanguntil the first one completes.
还提出了一个github issue要求改进有关交易的文档。
编辑 2: 对于服务器端 SDK,我找到了一个 response这可能会有所帮助,但是没有关于事务如何工作的官方文档,除了它运行悲观锁,理论上允许所有读取,除非它尝试写入,在这种情况下,它将在记录上放置一个独占锁,以防止其他用户操纵它
编辑:接下来的响应仅适用于运行乐观锁的客户端SDK,不适用于运行悲观锁的服务端SDK
事实上,您必须意识到,如果在执行事务时读取的内容发生更改,则读取事务可能会运行多次,这样做是为了确保内容是最新的。
可以找到有关此行为的更多信息 here
if a transaction reads documents and another client modifies any of those documents, Cloud Firestore retries the transaction. This feature ensures that the transaction runs on up-to-date and consistent data.
这里
(When using transactions, note that) A function calling a transaction (transaction function) might run more than once if a concurrent edit affects a document that the transaction reads.
关于node.js - Firestore 事务锁会阻止读取吗? (服务端SDK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62262492/
我有一个使用 css 列的下拉菜单,当我使用 jquery slide() 时,它会调整下拉框的大小,并重排内容直到达到完整高度。 这是一个工作示例 https://codepen.io/peterg
我有一个带有嵌套 ScrollViewer 的 Expander,如下所示: 代码(简化版)
我想在所有 ajax 调用之后调用一些 javascript 函数。我知道如何调用每个单独的 ajax 调用中的函数,如下所示: function xyz() { if (window.XMLHttp
我想将值从应用程序端传递到 api。在此 api 调用中传递图像、名字、电子邮件、电话和位置。在 Debug模式下,检查值不会被传递。 代码下方 File file = null;
我正在尝试在使用reportlab生成的pdf中的表格后插入分页符,我正在使用以下函数生成pdf: def render_to_pdf(template_src, context_dict): t
CBPeripheralManager 是否有推荐的方法来终止连接。到目前为止我发现的最好的方法就是干脆不响应动态值,然后 BLE 堆栈似乎关闭了连接,但这似乎很粗糙。 一定有更好的方法吗? 最佳答案
我的 API 的 REST 端位于以下地址:http://test.jll.aplikacje-dedykowane.pl/rest/warehouse/all 。现在,我尝试返回在此页面准备的 JS
我有以下 CPP 代码。我想做的是,当我的 native 端发生错误时,我会通知 Java 该错误。我用了How can I catch SIGSEGV (segmentation fault) an
限制对象的方法之一是像这样给函数添加限制 def ten_objects(): obj = Model.objects.all()[0:10] # limit to 10 retur
我目前在电信公司实习,这是一个专业,也是本科生。我有很多选择。据我所知,我知道独立应用程序端的 c、c++、c#、java 语言,在移动端我尝试进入 android 世界,也知道 php、mysql、
我想让我的边框底部看起来像这样: 有一个 flex 的末端。目前它看起来像这样: 我尝试使用的 CSS 是 border-bottom-right-radius: 10px;。代码如下所示:
我有一个 Flutter 项目,突然间,据我所知,我没有做任何特别的事情..Android 端开始显示错误,我完全迷路了,我完全不知道哪里出了问题,也不知道为什么会这样。 这就是我打开 android
我有一个自定义对象列表 (List) 。我需要将此数据发送到 React Native 端以显示在平面列表中。我该怎么做?这个列表出现在 类 NativeToReact(reactContext:Re
我有这个代码: #if defined(NOT_STANDALONE) JNIEXPORT void JNICALL sumTraces (JNIEnv* env, jclass caller,
我有一个定义一对多模型关系的 Django 应用程序。模型如下所示: from django.db import models # Create your models here. class Str
我有以下代码,它根据 IFrame 内容的大小调整 IFrame 的大小: function setIframeHeight(id) {
如何创建自定义过滤器 angularjs javascript Controller 端?我想通过 SegmentId 在名为段的数组中搜索,以创建过滤器,该过滤器通过 SegmentId 在段数组搜
我的代码在 netbeans 8.0.2 中我几乎尝试了所有方法,但没有结果。请帮助我。如何在 netbeans 中显示它? 最佳答案 您只需单击源包(源文件),它就会显示您的项目文件。 关于java
我想这是纯 C++ 问题和 OpenGL 问题之间的一种交叉。我有一个统一的缓冲区,并在其中分配 sizeof(ShaderData) 字节的空间。我在着色器的 GPU 端使用 std140 布局。
我对 Hadoop 中 reduce 端的文件合并过程的理解有问题,因为它在“Hadoop:权威指南”(Tom White)中有所描述。引用它: When all the map outputs ha
我是一名优秀的程序员,十分优秀!