Google Datastore 节点 API 中是不是存在乐观锁定?

Posted

技术标签:

【中文标题】Google Datastore 节点 API 中是不是存在乐观锁定?【英文标题】:Is there optimistic locking in Google Datastore node api?Google Datastore 节点 API 中是否存在乐观锁定? 【发布时间】:2017-08-08 02:56:30 【问题描述】:

我需要对我的谷歌数据存储类型实施乐观。

我使用的是自己的密钥,而不是生成的密钥,并使用了谷歌数据存储 node.js api。

由于插入、更新、更新插入似乎都委托给了 save() 方法(根据文档),如果我不小心,我很容易最终覆盖数据。

所以基本上我必须在进行任何插入或更新之前尝试“读取”,然后在调用 save() 之前必须小心“覆盖”正确的属性。

如果我设法读取并正确“覆盖”正确的字段,我仍然需要确保我是该实体的最新作者,因此我需要某种带有版本/时间戳字段的乐观锁定。我在某处读到这是内置的,但在https://googlecloudplatform.github.io/google-cloud-node/#/docs/datastore/0.7.1/datastore?method=insert的官方文档中并没有那么明确

有人可以解释一下吗?

【问题讨论】:

【参考方案1】:

Cloud Datastore 事务使用乐观锁定。

流程A:

T1 -> 开始交易 T2 -> 读取实体 X T4 -> 写入实体 X T5 -> 提交事务

流程 B:

T3 -> 写入实体 X

在上述场景中,由于 Cloud Datastore 使用乐观锁,进程 A 的事务将失败,因为实体 X 是在 Read 和 Write 之间写入的。

注意:insertupsertupdate 都映射到 save,但通过可选的 method 字符串显式传递方法,以便执行正确的写入类型:source

【讨论】:

所以它有自己的某种内部版本/时间戳,用于乐观锁?只是为了确定-无论如何我都应该调用 save() 作为 insert/upsert/update all map 吗? 1) 是的,它有自己的内部版本号。 2)不完全。正如我所提到的,它不仅仅是映射到保存,而且还传递一个参数来告诉保存执行什么类型的操作。如果您直接调用 save(),则需要确保将该参数设置为适当的(因此只需调用正确的 insert/update/upsert 方法即可) 顺便说一句,当我通过 ds.transaction() 获得交易然后继续在 transaction.run() 块内完成我的工作时.. 那么是否允许混合多个 transaction.update 和交易。在最终执行 transaction.commit() 之前插入不同的类型 是的,种类没有区别。如果您跨实体组(不同的根实体)执行插入/更新,则称为“跨实体组 (XG) 事务”。在 XG 交易中最多有 25 个不同的实体组。

以上是关于Google Datastore 节点 API 中是不是存在乐观锁定?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Endpoints 与 Cloud Datastore api 服务之间的比较

SerializationException while desalinization com.google.appengine.api.datastore.Key GWT

使用 Google Cloud Datastore API 的 Spring Boot 无法运行

在 Google Cloud Datastore 上使用动态类型

Google Datastore 部分字符串匹配

Google Cloud Datastore 过滤包含列表中项目的数据