我在 firebase 實時資料庫中有一條路徑,我想在其中使用遞增鍵:
/foo/1 {a: "some data"}
/foo/2 {a: "some other data"}
現在,我正在查詢最后一個 /foo/ 記錄以獲取最后一個數字,并將 /foo/3 設定為最新物件。然而,這是一種競爭條件——如果兩個用戶同時嘗試這樣做,可能會導致他們都創建 /foo/3 (并且一個覆寫另一個)。
有什么辦法可以安全地做到這一點?看起來實時資料庫對事務的支持有限,但我不確定它們是否可以用于這個用例。
提前致謝!
編輯:這正是我目前正在做的
const fooCollection = await admin.database().ref("foo").limitToLast(1).get();
let lastFooId;
fooCollection.forEach(snapshot => {
lastFooId = snapshot.key
})
let newFooId = 0;
if(lastFooId) {
newFooId = parseInt(lastFooId) 1;
}
await admin.database().ref(`/foo/${newOrderId}`).set(fooData);
有沒有辦法可以在 /foo/ 路徑上進行交易?
uj5u.com熱心網友回復:
無法在 Firebase 實時資料庫的事務中執行查詢。
這樣做的慣用方法是將計數器值保持在已知路徑(通常在其他資料庫中稱為序列),而不是使用查詢來確定其值 - 然后使用事務(或多路徑更新)將新值寫入該序列/值和新節點。
這也將解決因查詢偶數增長串列而產生的固有可伸縮性問題。即使該限制是數十萬(或者現在更可能是:數百萬)節點,使用沒有這種可擴展性限制的方法仍然更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484892.html
標籤:火力基地 firebase-实时数据库 交易
上一篇:for-loop應該等待未來
