服务器在事务中读取(云功能)时,Firestore文档是否被锁定?

时间:2019-06-04 22:28:13

标签: firebase transactions google-cloud-firestore

我知道Firestore对服务器中的事务使用锁定(云功能),如以下视频所述:https://www.youtube.com/watch?v=dOVSr0OsAoU

该视频详细说明了事务如何在CLIENT中工作(并且未在其中使用锁),但是对于SERVER事务却做得不好。

其中哪些是正确的(关于SERVER事务)?:

1)文档被服务器事务中的get锁定,因此其他服务器事务无法在第一个事务完成之前get对其进行锁定。

2)文档被服务器事务中的get锁定,但仅用于写操作,因此其他服务器事务可以在第一个事务完成之前获取它,但不能对其进行修改。

3)文档没有被服务器事务中的get锁定,只能写入。

编辑:我需要权威资源(Firebase团队中某人的文档或视频或博客中的一些参考文献)。

2 个答案:

答案 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()