Couchdb在批量更新时锁定文档

时间:2017-02-07 15:14:18

标签: couchdb

有没有办法在执行批量保存时在Couchdb中创建锁?我相信没有内置的方法来实现这一目标,但是有可能通过解决方法来解决这个问题吗?我有一个类似于以下的场景(我使用Node.js与couchdb数据库进行交互):

用户支付另一个用户创建新文档对象,如下所示:

{
    _id: SOMEID
    type: "PAYMENT"
    username: SOMEUSER
    paidto: ANOTHERUSER
    amount: 10
}

当保存时,我还需要更新用户在他/她account document中的剩余余额(从他/她的钱包中减去10)。然后我使用bulk_docs(新创建的transaction document和更新的account document)一次保存这两个文档。

但是,如果在此过程中用户通过其他方法对account document进行了更改(让我们在另一个标签中说),我们遇到的问题是,新的transaction document会被保存,而account document无法更新。这会产生很大的问题和一致性问题。

要解决此问题,我们必须锁定account document,直到批量保存过程结束,在此过程中,第二个标签中的进程将等待锁定被释放。

我正在尝试部署Couchdb是一个文档之间的一致性非常重要但没有锁定的环境,这种情况非常困难。

1 个答案:

答案 0 :(得分:1)

  

保存后,我还需要更新用户在其帐户文件中的剩余余额(从他/她的钱包中减去10)。

别。银行业务是文档数据库的very well documented example。最佳做法是仅将交易存储为文档,并将帐户余额视为对视图的查询(由帐户索引的交易)。

地图

function(o) {
  if (o.paidto && o.amount && o.username) {
    emit(o.paidto, o.amount);
    emit(o.username, -o.amount);
  }
}

减少

_sum

查询

GET /mydb/_design/mydesign/_view/myview/?group=true&key=SOMEUSER