2
我有一個名爲Wallet
的表格,可以將其視爲用戶餘額。每個用戶有一個文檔,因此我創建了主鍵userId
,並且存在用於存儲用戶餘額的balance
字段。我最初的想法是,我需要能夠從數據庫中提取文檔,並在更改用戶餘額前在應用程序層執行某些檢查,因此這排除了.get(id).update(...)
,我知道這是原子性的。如何在RethinkDB中使用多於主鍵的原子更新?
我所做的卻是添加了一個名爲lock
的屬性,它是一個字符串。應用程序必須首先.get(id).update({ lock: reallylongstring })
,然後當應用程序準備提交更改時,它們必須將該鎖返回,理想情況下,如果鎖定錯誤(意味着其他人進來並獲得鎖定),Rethink將拒絕所有更改。
如果這是蒙戈我會做這樣的事情:
this.findOneAndUpdate({
_id: id,
lock: lock
}, {
...
})
,然後再恢復錯誤的鎖定將失敗,因爲該文件將無法找到任何更新。在Rethink中做這件事的最好方法是什麼?或者,我的方法是錯誤的,什麼是更好的方法?
其實,我很抱歉,只有第二個例子實際上是原子!第一個不是因爲鎖定可能會在檢查過濾器和應用更新之間發生變化。 – mlucy