Javascript 数据库群集-异步任务
假设我有一个名为“products”的couchDB数据库和一个带有表单的前端。 现在,如果用户以我希望阻止其他用户编辑此特定文档的形式打开此数据库中的文档 通常很简单:Javascript 数据库群集-异步任务,javascript,asynchronous,couchdb,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 d
-> 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用来维护数据库的一致性。更新文档时,您必须同时提供ID(\u ID
)和修订号(\u rev
),否则您的更改将被拒绝
这意味着,如果两个客户端在版本1读取文档,并且都试图使用相同的版本号编写更改,则数据库将只接受第一个版本号。第二个客户端将收到一个错误,它应该获取文档的最新版本才能继续
在单节点环境中,此模型可完全防止冲突。但是,在发生复制的情况下,即使使用MVCC,仍然可能发生冲突。这是因为在相互复制之前,冲突的修订可以在技术上写入不同的节点。在这种情况下,CouchDB将记录冲突,您的应用程序负责解决冲突
CouchDB有一流的文档,特别是我极力推荐的文档。CouchDB用于维护数据库的一致性。更新文档时,您必须同时提供ID(\u ID
)和修订号(\u rev
),否则您的更改将被拒绝
这意味着,如果两个客户端在版本1读取文档,并且都试图使用相同的版本号编写更改,则数据库将只接受第一个版本号。第二个客户端将收到一个错误,它应该获取文档的最新版本才能继续
在单节点环境中,此模型可完全防止冲突。但是,在发生复制的情况下,即使使用MVCC,仍然可能发生冲突。这是因为在相互复制之前,冲突的修订可以在技术上写入不同的节点。在这种情况下,CouchDB将记录冲突,您的应用程序负责解决冲突
CouchDB有一流的文档,特别是我强烈推荐的文档。如果他们同时保存文档,会导致冲突。所以你的解决方案都没有用处。使用更新处理程序可以减少发生冲突的机会,但仍然有可能。如果他们同时保存文档,则会导致冲突。所以你的解决方案都没有用处。使用更新处理程序可以减少发生冲突的机会,但仍然有可能。