【问题标题】: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的官方文档中并没有那么明确

有人可以解释一下吗?

【问题讨论】:

    标签: node.js database transactions google-cloud-datastore google-cloud-platform


    【解决方案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 个不同的实体组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多