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

Mar*_*rcG 5 transactions firebase google-cloud-firestore

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

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

以下哪项是正确的(关于SERVER事务)?:

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

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

3)get在服务器事务中,文件不会被s 锁定,只能写入。

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

Ale*_*amo 5

服务器端事务通常像客户端库一样工作,但不是以该视频中提到的并发模型tehnique而是以锁定数据的传统方式工作。因此,即使您在单个文档或查询上使用事务,这些文档也将被锁定,直到事务完成为止。

要回答您的问题,因为来自云功能的事务是在内部进行的(可能需要几毫秒),因此文档会锁定该时间。这意味着这些文件不能被任何其他交易获取或更改。

1)文档被获取到服务器事务中而被锁定,因此其他服务器事务无法在第一个事务完成之前获取它。

正确。

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

另一个事务获取锁定的文档没有任何意义。由于无法更改,为什么要尝试获取此类文档?而且,在交易完成时,锁定的文档可能具有不同的值。在事务开始到完成之间,文档中的某些属性会更改。

3)文件没有被服务器事务锁住,只能写。

一旦云功能运行了事务,该文档即被锁定,并在事务完成时释放该锁定。

编辑:

另一个事务获取锁定的文档确实有意义。它无法更改,但是如果可以读取

我是严格按照写作来指称的。可以读取所有文档,无论文档是否被锁定。

如果您只想读取值

如果您只想读取该值,则无需担心。阅读时没有锁定文件。

也许您需要读取一些值才能做出有关更改另一个文档的决定,甚至只是向用户显示一些信息。

它将工作正常。

另外,根据交易的不同,您不必担心文档是否在下一秒内发生更改。例如,如果用户想知道其银行帐户中的金额,则可以显示一秒钟之前的值,这没问题。

对,那是正确的。读操作没有任何限制,关于您的示例,是的,很好。这也在我的项目之一中进行。

您能指出我的消息来源吗?

那里有许多资源说明了锁定数据的传统方式是如何工作的。正如Todd Kerpelman在喜欢的视频中确认的那样,服务器端事务以这种方式工作。此锁定的目的是服务和保护共享资源(文档)。

我确实需要绝对确定这一点,因此我需要消息来源,或者由Firebase团队的人员进行确认。

我们还希望Firebase团队中的人能花些时间来研究一下,但是我不确定我是否理解您的担忧?您是否认为在进行交易时不会笨拙地阅读文档?要么?


小智 -1

根据Firestore有关事务和批量写入的文档,

事务由任意数量的get()操作组成,后跟任意数量的写入操作,例如set()update()delete()。如果是并发编辑,Cloud Firestore 会再次运行整个事务。例如,如果事务读取文档并且另一个客户端修改其中任何文档,则 Cloud Firestore 会重试该事务。此功能可确保事务在最新且一致的数据上运行。

结论get():在服务器事务中文档没有被 s 锁定。但是当一个文档在当前事务中之后被另一个事务修改时get(),会导致当前事务重试,从而再次更新文档get()