我需要做事务(开始、提交或回滚)、锁定(选择更新)。
如何在文档模型数据库中执行此操作?
编辑:
情况是这样的:
我可以用 CouchDB 解决这个问题吗?
最佳答案
不。CouchDB 使用“乐观并发”模型。用最简单的术语来说,这只是意味着您随更新一起发送文档版本,如果当前文档版本与您发送的版本不匹配,CouchDB 将拒绝更改。
这看似简单,真的。您可以为 CouchDB 重构许多基于普通事务的场景。不过,在学习 CouchDB 时,您确实需要抛开 RDBMS 领域知识。从更高的层次解决问题是有帮助的,而不是试图将 Couch 塑造成基于 SQL 的世界。
跟踪库存
您概述的问题主要是库存问题。如果您有一个描述项目的文档,并且它包含一个“可用数量”字段,您可以像这样处理并发问题:
_rev
CouchDB 发送的属性 _rev
发回更新的文档属性(property)_rev
匹配当前存储的号码,大功告成! _rev
不匹配时),检索最新的文档版本 在这种情况下,有两种可能的故障场景需要考虑。如果最新的文档版本的数量为 0,您可以像在 RDBMS 中一样处理它,并提醒用户他们实际上无法购买他们想要购买的东西。如果最新的文档版本的数量大于 0,您只需使用更新的数据重复该操作,然后从头开始。这迫使您比 RDBMS 做更多的工作,并且如果频繁出现冲突的更新可能会有点烦人。
现在,我刚刚给出的答案假设您将在 CouchDB 中以与在 RDBMS 中的方式大致相同的方式进行操作。我可能会以不同的方式处理这个问题:
我将从包含所有描述符数据(名称、图片、描述、价格等)的“主产品”文档开始。然后我会为每个特定实例添加一个“库存单”文档,字段为
product_key
和 claimed_by
.如果您正在销售锤子模型,并且有 20 个要出售,那么您可能会拥有带有 hammer-1
之类的 key 的文档。 , hammer-2
等,代表每个可用的锤子。然后,我将创建一个 View ,该 View 为我提供可用锤子的列表,并带有一个可让我查看“总数”的 reduce 函数。这些完全是袖手旁观,但应该让您了解工作 View 的样子。
map
function(doc)
{
if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) {
emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev });
}
}
这给了我一个可用的“票”列表,按产品 key 。当有人想买锤子时,我可以捕获其中的一组,然后迭代发送更新(使用
id
和 _rev
),直到我成功申领一个(之前申领的门票将导致更新错误)。减少
function (keys, values, combine) {
return values.length;
}
这个reduce函数简单地返回无人认领的总数
inventory_ticket
项目,因此您可以知道有多少“锤子”可供购买。注意事项
这个解决方案代表了对您提出的特定问题的大约 3.5 分钟的总思考时间。可能有更好的方法来做到这一点!也就是说,它确实大大减少了冲突更新,并减少了用新更新来响应冲突的需要。在此模型下,您不会有多个用户尝试更改主要产品条目中的数据。在最糟糕的情况下,您将有多个用户尝试索取一张票,如果您从 View 中捕获了其中的几个,您只需转到下一张票并重试。
引用:https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F
关于database - 我可以在 CouchDB 中进行事务和锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299723/