- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我以前从未使用过 CouchDB/MongoDB/Couchbase,现在正在为我的应用程序评估它们。总的来说,它们似乎是我想使用的非常有趣的技术。然而,由于有 RDBMS 背景,我对缺少事务感到厌烦。但与此同时,我知道考虑到数据的组织方式,对事务的需求将大大减少,就像我在 RDBMS 中所需要的那样。
话虽如此,我有以下要求,但不确定是否/如何使用 NoSQL 数据库。
给定 RDBMS,这将相当简单。一张表用于客户端,一张(或多张)用于文件。在客户表中,保留一个最后一个文件编号的计数器,并在向文件表中插入新记录时递增 1。将所有内容包装在一个事务中,您就可以确信不会存在不一致。哎呀,为了安全起见,我什至可以在 (clientId, filenumber) 索引上设置唯一约束,以确保永远不会为客户端使用两次相同的文件号。
我怎样才能在 MongoDB 或 CouchDB/base 中完成类似的事情?它甚至可行吗?我一直在阅读有关两阶段提交的信息,但我似乎无法理解在这种情况下它是如何工作的。 Spring/Java 中是否有任何东西可以提供适用于这些数据库的两阶段提交,或者它是否需要自定义代码?
最佳答案
Couchdb 默认是事务性的。 couchdb 中的每个文档都包含一个 _rev
键。对文档的所有更新都是针对此 _rev
键执行的:-
查看 this answer by MrKurt以获得更详细的解释。
couchdb recipies有一个银行示例,展示了如何在 couchdb 中完成交易。
还有这个atomic bank transfers说明 couchdb 中事务的文章。
无论如何,所有这些链接的共同主题是,如果您遵循针对 _rev
进行更新的 couchdb 模式,您的数据库中就不会出现不一致的状态。
Heck, just to be safe, I could even put a unique constraint on a (clientId, filenumber) index to ensure that there is never the same filenumber used twice for a client.
所有 couchdb 文档都是唯一的,因为两个文档中的 _id
字段不能相同。查看view cookbook
This is an easy one: within a CouchDB database, each document must have a unique _id field. If you require unique values in a database, just assign them to a document’s _id field and CouchDB will enforce uniqueness for you.
There’s one caveat, though: in the distributed case, when you are running more than one CouchDB node that accepts write requests, uniqueness can be guaranteed only per node or outside of CouchDB. CouchDB will allow two identical IDs to be written to two different nodes. On replication, CouchDB will detect a conflict and flag the document accordingly.
根据评论编辑
In a case where you want to increment a field in one document based on the successful insert of another document
在这种情况下,您可以使用单独的文档。你插入一个文件,等待成功响应。然后添加另一个文档,如
{_id:'some_id','count':1}
有了它,您可以设置一个 map reduce View ,它只计算这些文档的结果,并且您有一个更新计数器。您所做的只是插入一个新文档以反射(reflect)插入成功,而不是为更新更新单个文档。
I always end up with the case where a failed file insert would leave the DB in an inconsistent state especially with another client successfully inserting a file at the same time.
好的,我已经描述了如何对单独的文档进行更新,但即使更新单个文档,您也可以避免不一致,如果您:
为什么这有效?
这是可行的,因为当您尝试更新 update document
时,您必须提供 _rev
字符串。您可以将 _rev
视为文档的本地状态。考虑这种情况:-
_rev
陈旧
的_rev
更新文档。_rev
并尝试更新它。因此,如果您这样做,您将始终需要根据文档的最新版本进行更新。我希望这能让事情变得更清楚一些。
注意:
正如 Daniel 所指出的,_rev
规则不适用于批量更新。
关于java - CouchDB/Couchbase/MongoDB 事务模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25735979/
我有看起来像这样的文件: { "name": "n", "age": 22 //other properties "hash": "XyRZHDJJD6738..." //This property
有下一个对象 "a" : { "id" : "1", "arr" : [ {"id" : "b1"}, {"id" : "b2"} ] } "b1" : { "id" : "b
Couchbase 文档说“磁盘持久性使您能够执行备份和恢复操作,并使您能够将数据集增长到比内置缓存层更大的数据集”,但我似乎无法让它发挥作用。 我正在一个三节点集群上测试 Couchbase 2.5
我搜索了有关 Couchbase 如何在集群内实现强一致性的解释。这一切都是因为使用了membase吗? 最佳答案 顺便说一句,Couchbase 是 membase。 Couchbase 是一个产品
我有以下格式存储的 couchbase 文档: { "userEmail": "satyam@xyz.com", "hashedPassword": "$2a$12$MT31FHNEbOAKpQGzL
请在下方找到有关 Couchbase 产品路线图的问题。 上下文 我目前正在研究一项将现有系统(后端应用程序和移动应用程序)转变为 Multi-Tenancy 应用程序的功能。 堆栈将是: 沙发底座
什么是 Couchbase,什么是 Couchbase Lite?两者之间有什么区别吗?如何在移动设备中创建 couchbase lite 以及如何与服务器通信? 最佳答案 你碰巧知道CouchDB
我正在寻找一种使用 Spring Data Couchbase 连接到两个单独的 Couchbase 集群的方法。查看文档和实现,不清楚如何执行此操作,我担心如果有两个扩展 AbstractCouch
我想使用 couchbase lite 和 couchbase syncgetway 在 nodejs 中开发一个 CRUD 应用程序。我想在 Raspberry-pi 上运行这个 Node js 应
我在 couchbase 存储桶中有具有这种结构的文件: "name": { "grandfather": { "parent1": { "ch
我有一个依赖于另一个的文件。第一的: { "doctype": "closed_auctions", "seller": { "person": "person11304" },
我以前使用过 couchdb 并且非常喜欢它的 UI,因为我可以直接在 UI 中创建 View 并测试它们并查看文档。 因为,我需要扩展,所以我开始使用 couchbase。但是,在安装 couchb
我的环境中有一个二级索引(没有复制),我想知道如何在不删除索引的情况下创建复制? 我不想删除索引并用副本重新创建它,因为我没有使用主索引,因此有约束。 谢谢 最佳答案 即将发布的 6.50 版本您可以
我正在考虑将 couchbase 用于我的下一个 Web 应用程序,我想知道我的数据应该如何构建,特别是存储桶的使用。例如,假设每个用户将拥有大量唯一数据,是否应该为每个用户创建一个单独的存储桶(甚至
我正在开发一个小型 express 应用程序,目前允许用户登录(通过护照)并查看有关他们 friend 的信息,即购买历史记录、喜欢等。理想情况下,我希望每个用户都有一个随附的个人资料照片和他们购买的
对于 Cassandra,假设复制因子为 1(即数据集的两个副本),至少需要三个节点才能启用具有强一致性的写入。 Couchbase 似乎没有这个要求,至少我没有在任何地方找到它。尽管如此,Couch
我正在使用 Couchbase 存储桶,其中所有文档都使用 DocType 保存。标识包含什么类型的数据的属性。我想执行一个查询,从每个 DocType 给我一个结果, 用作所有文档类型的示例。 我可
无法更改 Couchbase 控制台的端口号。默认为 8091。我试图在已知的 static_config 文件中附加一行。这条线就像- {rest_port, 9000}. 这是我缺少文件的屏幕。
我想使用 Couchbase,但我想在一些类似于 RethinkDB 的方式实现更改跟踪。 似乎有很多方法可以将更改从 Couchbase 服务器推送给我。 DCP 点击 XDCR 哪一个是正确的选择
我有一个 couchbase 文档,id 为 x x 没有子文档,因为在一些子文档操作中都被删除了,它是这样的 {} 我想删除所有没有子文档的空文档。是否可以在 couchbase 中使用 N1QL
我是一名优秀的程序员,十分优秀!