【问题标题】:Oracle Soda - VERSION field use caseOracle Soda - VERSION 现场用例
【发布时间】:2020-10-31 02:47:53
【问题描述】:
我正在研究 Oracle SODA 在我的 Java 项目中将其用作 no-sql 的文档存储。
每个集合都表示为 Oracle 数据库中的一个 SQL 表。该表由一些字段组成,例如包含 JSON 有效负载的 BLOB 和 VERSION 字段。
你能给我一些在版本领域有用的用例吗?
如何使用?它是用于 JSON 版本控制,还是由数据库管理的私有字段?
【问题讨论】:
标签:
json
oracle
soda
oracle-soda
【解决方案1】:
我假设您正在查看 Java implementation of SODA(因为您提到您正在做一个 Java 项目)。
每个文档的版本组件由 SODA 自动维护,并用作文档内容已更改的指示器。每当文档内容发生变化(例如,由于替换运算符),版本就会发生变化。一种有用的常见方法是“乐观锁定”:您可以使用版本来确保在更新或删除事务中的文档之前文档没有更改。例如:
col.find().key("k1").version("123E...").replaceOneAndGet(...)
这将用密钥k1 替换文档,但前提是其版本与提供的十六进制版本字符串匹配(即,如果另一个事务在您的事务上次读取文档后更新了文档,那么其存储的版本将与那个不匹配提供给version(...) 方法,替换不会成功)。
如何获取文档的当前版本?当您最初使用insertAndGet(...) 插入文档时,返回的结果文档将包含为该文档自动生成的版本。如果使用replaceOneAndGet(...)成功更新文档,返回的结果文档也会有更新版本。
如果您正在构建 REST 应用程序,版本也可以用作 eTag。
有不同的版本控制方法可用(这些可以在集合创建时选择)。查看他们的描述here。可以在集合创建期间选择适当的方法。
目前,本地数据库的默认设置是 SHA256,但我们正在从 UUID 转向 UUID(它的生成成本更低,并且不会阻止我们将来想要进行的一些优化)。它已经是一些云环境(自治数据库云服务)中 SODA 的新默认值。如果您想了解有关不同版本控制方法的优缺点的更多信息,或者如何使用这些方法配置集合,请告诉我。一般来说,我们建议使用 UUID,除非有充分的理由选择另一种版本控制方法。