2015-12-16 29 views
2

我有一個名爲Wallet的表格,可以將其視爲用戶餘額。每個用戶有一個文檔,因此我創建了主鍵userId,並且存在用於存儲用戶餘額的balance字段。我最初的想法是,我需要能夠從數據庫中提取文檔,並在更改用戶餘額前在應用程序層執行某些檢查,因此這排除了.get(id).update(...),我知道這是原子性的。如何在RethinkDB中使用多於主鍵的原子更新?

我所做的卻是添加了一個名爲lock的屬性,它是一個字符串。應用程序必須首先.get(id).update({ lock: reallylongstring }),然後當應用程序準備提交更改時,它們必須將該鎖返回,理想情況下,如果鎖定錯誤(意味着其他人進來並獲得鎖定),Rethink將拒絕所有更改。

如果這是蒙戈我會做這樣的事情:

this.findOneAndUpdate({ 
    _id: id, 
    lock: lock 
}, { 
    ... 
}) 

,然後再恢復錯誤的鎖定將失敗,因爲該文件將無法找到任何更新。在Rethink中做這件事的最好方法是什麼?或者,我的方法是錯誤的,什麼是更好的方法?

回答

2

你可以把branchupdate

.get(id).update(function(row) { 
    return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ...")); 
}) 

編輯:刪除不正確的選項。

+2

其實,我很抱歉,只有第二個例子實際上是原子!第一個不是因爲鎖定可能會在檢查過濾器和應用更新之間發生變化。 – mlucy