gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:09:55 25 4
gpt4 key购买 nike

假设我有一个名为“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com