【发布时间】:2018-05-10 05:11:56
【问题描述】:
上下文
我对 SQL 事务 有基本的了解,其流程类似于:
-
BEGIN一个 SQL 事务。为了论证,假设我们使用Read Committed隔离级别。 - 在 SQL 事务中运行任意数量的
INSERT、UPDATE和DELETE语句。外面都看不到 由于我们在这个假设中使用的“已提交读”隔离级别,事务(尚未)。 -
COMMIT交易,将我们的INSERTs、UPDATEs 和DElETEs 发送给其他人。或者ROLLBACK更改。无论哪种方式,交易都不再相关。
现在我正在尝试利用对 SQL 事务的理解来引导我对 Google 数据存储事务 的理解,但遇到了困难。 Datastore REST API v1 documentation 确实有 beginTransaction、commit 和 rollback 端点,所以乍一看,它看起来像是 SQL 事务系统的简单模拟。但是,Datastore commit 端点也可以作为我们(显然只是)修改 Datastore 中数据的机制。事实上,一个端点似乎负责两个(在我看来)不同但至关重要的操作,这让我感到困惑。
可能性(我已经探索过):
- 也许Datastore documentation 中有一些明显的东西我已经设法忽略了 - 嗯,这对我来说并不明显 ¯\_(ツ)_/¯
- 也许有一个未记录的幻影“变异”数据存储端点 - 不太可能,但我希望
- 也许有一种方法可以在不实际提交事务的情况下使用commit 端点的变异功能 - 提交端点有一个mode 参数,其值为
TRANSACTIONAL和NON_TRANSACTIONAL(其中被描述为“突变可能不适用于全部或不适用”)。也许NON_TRANSACTIONAL选项只是名称/描述不佳,可用于在事务中提交突变而不立即提交它们(但是当事务最终提交/回滚时,它们都将被提交/回滚)。我目前正在研究这个选项 - 也许 Datastore 不支持在不提交的情况下提交突变 - 我真的希望不是这种情况
- 也许数据存储事务的行为与 SQL 事务有很大不同 - 很有可能
- 也许我(上述)对 SQL 事务的理解不正确 - 那会非常尴尬
实际问题
如果数据存储区commit 端点将突变的提交和这些突变的提交混为一谈,我如何通过 REST API 向数据存储区提交修改而不立即提交这些修改?
【问题讨论】:
-
亲爱的 Jaysen,我在尝试实施 Datastore 事务时遇到了确切的问题。也许自从你发布这个问题以来,你比我更了解这个问题。如果不通过在提交中直接暗示事务的结束,是否真的不可能以事务方式创建、更新(或删除)?您是否找到了一种无需提交即可执行多个事务性创建、更新和删除的方法?
-
@GlobalRationality 凭记忆,我想我从来没有找到一个简洁的方法。我想我只需要围绕 API 的这一方面进行架构设计
标签: transactions google-cloud-datastore