【发布时间】:2016-09-27 13:46:47
【问题描述】:
假设我有一个名为“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 数组。在那里共享会以另一个异步任务结束,并导致上述相同的问题。
现在我没有主意了,大型集群系统通常如何处理这样的问题?
【问题讨论】:
-
如果同时保存文件,会产生冲突。因此,您的任何解决方案都没有用。使用更新处理程序可减少发生冲突的机会,但仍有可能发生。
标签: javascript asynchronous couchdb