【发布时间】:2020-06-08 12:49:29
【问题描述】:
我有一个带有 @google-cloud/firestore 的 Node.js 应用,它有两个集合,A 和 B。
Collection 一个文档有一个名为“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 个用户)。
在文档中,提到当执行写入时,有一个锁可以防止并发写入,是否也会阻止读取?另外,如果一个读事务被大量使用,那会阻塞写吗?
这就引出了以下两个问题:
- Firestore 读取事务是否会阻止 Node.js 中的其他读取事务?
- Firestore 读取事务会阻止 Node.js 中的写入事务吗?
【问题讨论】:
-
你能检查我的答案吗?有一些信息可以让你清楚交易是如何运作的
-
文档将使用 github 问题进行更新,现在我们知道交易是如何工作的@AndreasTzionis
标签: node.js firebase google-cloud-firestore transactions