2017-02-16 75 views
0

我可以在涉及多個位置的查詢上運行交易嗎?Firebase Web - 查詢中的交易

在DOC我看到例如startAt返回firebase.database.Query具有firebase.database.Reference類型的ref屬性其具有transaction方法。

所以我可以做:

ref.startAt(ver).ref.transaction(transactionUpdate).then(... ? 

會事務然後在多個位置正確操作和更新呢?

我想要做的是從特定版本(鍵)以來獲取所有位置,然後將它們標記爲「讀取」,以便寫入客戶端不會更新它們。爲此我需要一個事務而不是簡單的更新。

Thx!

回答

1

答案對所有問題都是「否」。

  1. Query的ref屬性爲您提供了設置查詢的節點的參考。考慮一下如何構建查詢。換句話說,ref.startAt(x).ref相當於ref

  2. 操作參考(導航到兒童,添加查詢選項等)完全獨立於任何查詢結果。這只是本地的,簡單的路徑操作,非常類似於格式化URL。

  3. 根據定義,事務只能在單個節點上使用該節點的值快照進行增量更新。他們不能「在多個地點操作並正確更新」。這些不是SQL事務,唯一常見的是名稱 - 不幸的是,這可能會令人困惑。

  4. 起始節點不一定是葉節點。但是,如果您在「父」節點上啓動交易,則客戶必須下載每個子代才能創建完整快照,如果其中任何一個客戶被其他客戶修改,可能會多次。
    這當然是一個非常緩慢,脆弱和昂貴操作,無論是爲用戶還是你,數據庫的所有者。一般來說,如果節點可能增長無限,則不建議運行事務。


我建議修訂所提出的戰略。更新「所有孩子」只是爲了存儲「讀取」標記而不是縮放。

例如,您可以將客戶端的上次讀取ID存儲在單個節點中,並編寫安全規則來強制執行沒有小於此ID的數據可能被修改的情況。

+0

謝謝!我現在明白了。 您建議的策略存在的問題是,在存儲'上次讀取ID'完成時,發送客戶端可能會更改該值。 – kofifus