javascript - 数据库集群-异步任务

标签 javascript asynchronous couchdb

假设我有一个名为“products”的 couchDB 数据库和一个带有表单的前端。 现在,如果用户以表单从该数据库打开文档,我想阻止其他用户编辑该特定文档。

通常非常简单:

-> read document from couchDB
-> set a variable to true like: { edit : true }
-> save (merge) document to couchDB
-> if someone else tries to open the document he will receive an error, becaus of edit:true.

但是,如果两个用户同时打开文档怎么办? 该函数将被调用两次,当第二个打开文档时,他会错误地收到 edit:false,因为第一个没有足够的时间来保存他的 edit:true。那么如何防止这种行为呢?

第一个解决方案是: 构建一个数组作为数据库请求的提示,并且不允许并行请求,因此所有请求都将被一个接一个地处理。但在我看来,这是一个糟糕的解决方案,因为系统在某些时候会非常慢。

第二个解决方案: 将当前编辑的文档的 documentID 存储在脚本中的本地数组中。这是可行的,因为这不是异步过程,第二个用户会立即收到他的错误。

到目前为止一切都很好,但是,如果有一天有太多用户并且该系统应该在集群中运行(节点客户端服务器,而不是数据库)怎么办?现在第二个解决方案将不再起作用,因为每个集群从属将有自己的 documentID 数组。在那里共享将导致另一个异步任务并导致上述相同的问题。

现在我没有主意了,大型集群系统通常如何处理这样的问题?

最佳答案

CouchDB 使用MVCC以保持数据库的一致性。更新文档时,您必须提供 ID (_id) 和修订号 (_rev),否则您的更改将被拒绝。

这意味着,如果 2 个客户端读取版本 1 的文档,并且都尝试使用相同的版本号写入更改,则数据库只会接受第一个客户端。第二个客户端将收到错误,它应该获取文档的最新版本才能继续。

在单节点环境中,此模型可以彻底防止冲突。然而,在发生复制的情况下,即使使用 MVCC,仍然可能会出现冲突。这是因为从技术上讲,冲突的修订版可以在相互复制之前写入不同的节点。在这种情况下,CouchDB 将记录冲突,您的应用程序负责解决它们。

CouchDB 拥有出色的文档,特别是 an article all about conflicts and replication我强烈推荐这个主题。

关于javascript - 数据库集群-异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39693692/

相关文章:

php - IE 打开两个弹出窗口而不是一个

.net - 向 Windows GUI 线程发送消息

couchdb - 多个键范围作为 CouchDB View 的参数

replication - CouchDB 冲突解决

javascript - JS 改变 CSS 嵌套 tr

javascript - div .height() 在调整大小后更改而不告诉它

javascript - iOS5 不支持 bind()!

C# 异步调用(本例中为 ASMX WebServices)

swift - 在异步网络请求中捕获 self weak 或 unowned

python latin-1 UnicodeDecodeError 在使用 couchdb cPickle 二进制数据切换到 ubuntu 14 后