当前位置: 首页 > 知识库问答 >
问题:

ndb事务内的数据存储实体读取(仅keys_only)

宰父焕
2023-03-14

我有一个关于ndb事务中数据存储实体读取的问题。

我知道,当我们在ndb事务中读取一个实体时,这个特定的实体会被锁定,任何其他线程都不能放置/更新/写入同一个实体,因为这会导致争用错误。这完全说得通。

然而,当我们只读取一个实体的键而不是事务内部的整个实体本身时,会发生什么呢?这可以通过在ndb.query()中将keys_only标志设为True来实现。在这种情况下,实体会再次被锁定吗?

共有2个答案

东门奕
2023-03-14

一般来说,最好从事务的保证——可串行化——而不是实现细节——在本例中是读/写锁的角度来考虑事务。实现细节(如何执行查询、锁定粒度、锁定的具体内容等)可能会随时改变,但保证不会改变。

对于这个特定的问题,并假设当前在数据存储模式下实现的Fi恢复:为了确保可串行性,事务T1中的仅键查询锁定了查询检查的索引条目范围。如果这样的查询返回了实体E的键K,那么在不同事务T2中删除E的尝试必须删除E的所有索引条目,包括查询锁定范围内的条目。因此在本例中,T1和T2需要相同的锁,两个事务中的一个将被延迟或中止。

请注意,T2 还有其他方式与 T1 冲突:它还可能创建一个与 T1 的查询匹配的新实体(这需要在 T1 的查询锁定的范围内写入索引条目)。

最后如果T2更新(而不是删除)E的方式不需要对T1查询所检查范围内的索引条目进行任何更新(例如,如果查询类似于“从X中选择*,其中a=5”,并且对E的更新不会改变其“a”属性的值),那么T1和T2将不会冲突(这是一种优化——如果这两个事务发生冲突,行为仍然正确,事实上,对于“Datastore Native”数据库,它们可能会发生冲突)。

卫逸春
2023-03-14

事务锁的数据存储文档说明:

读写事务使用读取器/写入器锁来强制实施隔离和可序列化性。

它没有提到在交易过程中使用keys_only的细节的任何情况。因此,我认为这同样适用于这种情况,如果您认为您仍在进行读取,那么您只是忽略了数据,这确实是有道理的。

话虽如此,也许这是可以在数据存储中改进的东西,甚至可以在留档中明确说明。如果您愿意,您可以考虑打开一个功能请求,让谷歌通过以下链接来实现它。

 类似资料:
  • 我正试图让我的头绕过DDD,但我卡住了。这就是我如何设置我的项目: 然后,我继续实现UserRepository,这里我遇到了另一个问题:UserRepository接口需要域用户模型,当我试图在DAL中实现接口时,我需要使用域用户模型来实现它,这导致DAO是为域模型而不是DAL模型创建的,这没有任何意义。唯一能修正的就是在域层中引用DAL,这是错误的。 有人能解释一下我在DDD中遗漏了什么吗?

  • 根据Google的文档,我似乎有两个使用Python连接Datastore的主要选项:App Engine的NDB Datastore库和用于Python的Google Cloud Datastore API。 我目前在App Engine(标准),但我想结构我的应用程序,这样它可以增长超过如果需要,可能通过移动到计算引擎。考虑到这一点,我应该使用哪个库?App Engine的文档说明NDB是可以

  • 我们在游戏中通常需要存储用户数据,如音乐开关、显示语言等,如果是单机游戏还需要存储玩家存档。 Cocos Creator 中我们使用 cc.sys.localStorage 接口来进行用户数据存储和读取的操作。 cc.sys.localStorage 接口是按照 Web Storage API 来实现的,在 Web 平台运行时会直接调用 Web Storage API,在原生平台上会调用 sqli

  • 问题内容: 我从php收到一个json数组 我想要的是将此数据 写入我的应用程序数据文件夹中或安全的任何位置。 还要从中读取此数据并将其转换为可以进一步编辑的有效数据。 谁能告诉我一种方法我怎么可能做这件事? 问题答案: 从文件中读取字符串时,将其转换为JsonObject或JsonArray

  • 问题内容: 当我尝试从数据库中读取数据时,至少使用 抛出异常表示不存在事务。 当我添加注释时: 它工作正常。 但是,由于读取和访问数据每秒将发生百万次,因此我想确保不会不必要地阻塞我们的环境。 如果不是,创建只读事务的成本是多少? 我不能在没有事务的情况下结合Spring创建Hibernate Criteria Query吗? 问题答案: 所有数据库语句都在物理事务的上下文中执行,即使我们没有显式

  •  KAG 中、游戏的存储/读取、是通过(*)「栞(标签)」进行的。( 对无法使用此标记的用户,请修改 MainWindow.tjs )。  关于书签的说明,也请参考一下 游戏存档文件相关 的内容。  很遗憾的是、KAG 内建的存储・读取功能还无法做到随时存档。而是需要作者自行在剧本档中加入允许存储标签、也就是必须要设定存储・读取的「场所」。(译注:KAGeXpress内建了自动存档点,在每次使用[

  • 如果我要[按顺序]读取一个文件,其中包含两个团队以及他们每行的分数,例如: 黑豹3骑士5 火箭4泰坦9 天线8 Yahoos 6 黑豹10泰坦3 雅虎4火箭7 我需要想办法跟踪每支球队及其输赢,并将它们打印到新文件中。例如: 团队胜负 黑豹 1 1 火箭0 2 我面临的问题是,我不知道如何存储球队的名称,以便我能够在PrintWriter读取数据时将输赢添加到该球队。任何输入都将不胜感激,并提供解