4
我想知道如何在Firebase中相应地更新我的数据。Firebase:原子交易和多位置更新
我的应用是一个社交网络。假设我必须更新user
对象和post
中的查看计数,当访问者进来时,我还必须更新同一对象中的updatedAt
值。
- 的
views
和updatedAt
领域都有在post
和user
儿童特定.write
授权,因此任何人都可以对其进行修改,不像其他孩子。 - 的
views
儿童必须使用transaction
递增计数原子 - 的
updatedAt
孩子,另一方面,可以以任何方式更新,transaction
,set
或update
进行更新。
我想通过将这些更新放在一起来限制对Firebase的调用次数,并使整个更新原子化。 (也正因为有更多的,我不描述这里)
的问题是:
- 一个
transaction
同时更新views
和updatedAt
必须出现两次:在posts
和users
对象,但一个访客不能写在这些不属于他的物体上,只有两个views
和updatedAt
的孩子可以修改。 (即使其他人未触及)。 - 多位置事务在当前的Firebase API AFAIK中不可用,因此这也不是原子。
- 在多用户环境中,每个孩子的多位置更新会打破
view
孩子的原子性,这是一个问题。
最后,就是我目前在做:
一对views
孩子transaction
,并在updatedAt
那些单一update
,在两个posts
和users
对象,这使他们作业各查看各查看各访客。很多!
这也不是原子的,除了views
孩子,这对时间戳字段不是什么大问题,但在其他用例中仍然存在问题。
我的问题是:
任何建议为更好地执行?
”文档说更新会破坏在该对象上发生的所有事务,它是全局的吗?不。这是您更新路径上的所有交易。 –
对不起,我不明白,全球I ment:不仅是当前的用户会话,但应用程序的任何用户(我明白事务需要在更新的'路径'被取消)。我想这是答案显然是*是*。 – Pandaiolo
我的错误[Firebase文档](https://www.firebase.com/docs/web/api/firebase/transaction.html)明确表示,虽然交易在同一地点被本地'set'取消,它是*不*被其他客户端的'set'取消。如果其他客户端访问相同的位置,本地客户端将重新尝试使用最新数据的事务。 – Pandaiolo