我知道Firestore对服务器中的事务使用锁定(云功能),如以下视频所述:https://www.youtube.com/watch?v=dOVSr0OsAoU
该视频详细说明了事务如何在CLIENT中工作(并且未在其中使用锁),但是对于SERVER事务却做得不好。
其中哪些是正确的(关于SERVER事务)?:
1)文档被服务器事务中的get
锁定,因此其他服务器事务无法在第一个事务完成之前get
对其进行锁定。
2)文档被服务器事务中的get
锁定,但仅用于写操作,因此其他服务器事务可以在第一个事务完成之前获取它,但不能对其进行修改。
3)文档没有被服务器事务中的get
锁定,只能写入。
编辑:我需要权威资源(Firebase团队中某人的文档或视频或博客中的一些参考文献)。
答案 0 :(得分:3)
服务器端事务通常像客户端库一样工作,但不是以该视频中提到的并发模型tehnique而是以锁定数据的传统方式工作。因此,即使您在单个文档或查询上使用事务,这些文档也将被锁定,直到事务完成。
要回答您的问题,因为来自云功能的事务是在内部进行的(可能需要几毫秒),因此文档在此时间内被锁定。这意味着这些文件不能被任何其他交易获取或更改。
1)通过在服务器事务中获取文件来锁定文档,以便其他服务器事务在第一个事务完成之前无法获取该文件。
正确。
2)文档被获取到服务器事务中而被锁定,但仅用于写操作,因此其他服务器事务可以获取它,但在第一个事务完成之前不能对其进行修改。
另一个事务获取锁定的文档没有任何意义。由于无法更改,为什么要尝试获取此类文档?而且,在交易完成时,锁定的文档可能具有不同的值。在事务开始到完成之间,文档中的某些属性会更改。
3)文档没有被服务器事务中的文件锁定,只能写。
一旦云功能运行了事务,文档便被锁定,并在事务完成时释放锁定。
编辑:
另一个事务获取锁定的文档确实有意义。它无法更改,但可以读取
我严格按照写作来指称。不论文档是否被锁定,所有文档都可以读取。
如果您只想读取值
如果您只想读取该值,则无需担心。阅读时没有锁定文件。
也许您需要读取一些值才能做出有关更改另一个文档的决定,甚至只是向用户显示一些信息。
它会很好地工作。
此外,根据交易情况,您不必担心文档是否在下一秒内发生更改。例如,如果用户想知道其银行帐户中的金额,则可以显示一秒钟之前的值,没问题。
是的,这是正确的。读操作没有任何限制,关于您的示例,是的,很好。这也在我的项目之一中进行。
能否请您指出我的消息来源?
有很多资源可以解释传统的锁定数据方式。正如Todd Kerpelman在喜欢的视频中确认的那样,服务器端事务以这种方式工作。锁定的目的是服务和保护共享资源(文档)。
我确实需要绝对确定这一点,所以我需要消息来源,或者由Firebase团队的人员进行确认。
我们也希望Firebase团队中的某人能花些时间来研究一下,但是我不确定我是否理解您的担忧?您是否认为在进行交易时不会笨拙地阅读文档?还是?
答案 1 :(得分:-1)
根据有关Transactions and Batch writes的Firestore文档,
事务由任意数量的get()
操作和随后的任意数量的写操作(例如set()
,update()
或delete()
)组成。如果是并发编辑,Cloud Firestore将再次运行整个事务。例如,如果某个事务读取文档,而另一个客户端修改了这些文档中的任何一个,则Cloud Firestore重试该事务。此功能可确保交易在最新且一致的数据上运行。
结论:文档未在服务器事务中被get()
锁定。但是,当文档在当前事务中位于get()
之后被另一个事务修改时,将导致当前事务重试,以便更新后的文档再次为get()
。