Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据存储中强一致性和最终一致性的工作方式_Java_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Java 数据存储中强一致性和最终一致性的工作方式

Java 数据存储中强一致性和最终一致性的工作方式,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我不是数据库专家,所以我知道查询是在数据库中读写的方式 最终一致性读取将返回过时数据 在写查询中,将更新第一个数据节点,但其他节点将需要一些时间进行更新 在强一致性中,读取将被锁定,直到数据被修改为最新版本(我真的不确定我在这里说了什么,所以如果你搞错了,请帮助) 在写查询中,的所有读取操作将被锁定,直到数据节点被修改为其最新版本 因此,如果我将数据作为最终数据写入,并尝试获取该数据,我会得到最新版本吗 如果我使用祖先查询来更新,那么所有最终的读取操作都会得到最新版本吗 更新 我认为事务是存在的

我不是数据库专家,所以我知道查询是在数据库中读写的方式

最终一致性读取将返回过时数据

在写查询中,将更新第一个数据节点,但其他节点将需要一些时间进行更新

在强一致性中,读取将被锁定,直到数据被修改为最新版本(我真的不确定我在这里说了什么,所以如果你搞错了,请帮助)

在写查询中,的所有读取操作将被锁定,直到数据节点被修改为其最新版本

因此,如果我将数据作为最终数据写入,并尝试获取该数据,我会得到最新版本吗

如果我使用祖先查询来更新,那么所有最终的读取操作都会得到最新版本吗

更新


我认为事务是存在的,因此,如果对同一数据有多个修改请求,1将成功,其他将失败,在此之后,已修改的数据将需要一段时间才能在所有数据中心中复制,因此,如果事务成功,并不意味着所有读取查询都将返回最新版本(如果我正确,请更正我)对于GAE,保持一致性的唯一方法是使用事务,在可以更新的事务中,查询上一次更新,但速度较慢。
对于我来说,使用祖先只需组成主键就可以了。

如果使用所谓的“祖先查询”,则您正在事务中工作:要么事务成功终止,在这种情况下,所有后续读取都将获得事务更新的值,要么事务失败,在这种情况下,将看不到事务所做的任何更改(此all或nothing属性通常被称为“原子”事务)。特别是,通过这种方式,您确实获得了很强的一致性,而不仅仅是最终的一致性

就性能和可扩展性而言,成本可能很大。特别是,应用程序不应该每秒更新实体组(从一个共同祖先开始的任何和所有实体)超过一次,这对于一个高度可扩展的应用程序来说是一个非常有限制的限制

在线文档包含了大量关于如何处理此问题的提示、技巧和建议——您可以从本文最后列出的“其他资源”开始并继续


一个简单的想法是(不同于查询),从其键获取特定实体是强一致的,而不需要事务,
memcache
也是强一致的;编写修改后的实体将为您提供新的密钥,因此您可以将该密钥存储到memcache中,并让代码的其他部分从该密钥获取修改后的实体,而不是依赖于查询。当然,这是有限制的,因为
memcache
不会给你无限的空间——但是,在许多实际情况下,记住这是一个有用的想法。

这不是真的
get
操作和祖先查询始终是高度一致的。您能回答我的问题吗?我知道关于祖先查询用于向数据存储提供原子属性的事务,请回答我的问题并从是或否开始,以便我能理解