亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Firebase 并發鎖定/解鎖寫訪問多個設備

Firebase 并發鎖定/解鎖寫訪問多個設備

慕斯709654 2022-11-30 16:13:12
我正在尋找一些關于如何在多個設備的 android 并發訪問中鎖定/解鎖 firebase 寫訪問的提示我希望能夠做這樣的事情:獲得寫入權限并鎖定可運行進程 -> 從 firebase 獲取一些數據,處理它可運行進程 -> 從之前的可運行進程中取回數據,將一些數據寫入 firebase可運行進程 -> 從另一個可運行進程取回數據,獲取另一個數據,處理它們可運行進程 -> 寫入一些數據某某任務執行所有同步運行,將一堆數據寫入 firebase解鎖寫訪問我的第一個想法是添加超時。如果您在提供允許的數量之前未解鎖以確保沒有設備可以阻止訪問,則鎖定寫入可能會單獨過期。我閱讀了 Transaction,但我認為它不適合我的需求。因為我在處理時需要訪問多條路徑。任何人都知道如何實現設備在能夠寫入之前應該獲得的鎖定/解鎖寫入訪問權限?感謝您的任何想法。PS:我的可運行同步任務已經完美地完成了工作,我只是在尋找如何鎖定和解鎖 firebase 的寫訪問權限,以確保在我處理一些數據時沒有其他設備可以破壞數據。
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

有一種方法

在這里如何做:

  • 使用交易

  • 在您想要的路徑上讀取一個條目并鎖定您想要的路徑,條目是設備的 guid + 時間戳。

  • 如果時間戳 < 比你的,路徑沒有鎖,你可以通過寫你的 guid 和你的時間戳 + 你需要鎖的時間來獲取它。

  • 當交易成功時,你就是贏家,可以為所欲為。

  • 完成后,寫入當前時間戳以釋放鎖


查看完整回答
反對 回復 2022-11-30
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

如果有人需要它,這就是我在特定路徑 3s 處構建和獲取一把鎖的方法。- 在每個表(路徑),您可以關聯一個包含此路徑鎖的 tableInfo。- 如果沒有其他人需要鎖,則獲取、釋放和延長時間。您可以使用嘗試獲取此鎖的其他設備的 guid 在另一個字段上添加偵聽器。并樂于釋放它而不是延長你的時間。


fbBase.child(tableInfoChildRef).child(TableInfo.Field.Lock.name).runTransaction(new Transaction.Handler() {

                public Map<String, Object> lock(){

                    Map<String, Object> data = new ArrayMap<>();

                    data.put(TableInfo.Field.Lock.guid, AppGUID.get().toString());

                    data.put(TableInfo.Field.Lock.timestamp, System.currentTimeMillis()+3000);

                    return data;

                }


                @NonNull

                @Override

                public Transaction.Result doTransaction(@NonNull MutableData mutableData) {


                    if(mutableData.getValue() == null) {

                        mutableData.setValue(lock());

                        return Transaction.success(mutableData);

                    }else{

                        Long lockTimestamp = mutableData.child(TableInfo.Field.Lock.timestamp).getValue(Long.class);

                        if(lockTimestamp < System.currentTimeMillis()){

                            mutableData.setValue(lock());

                            return Transaction.success(mutableData);

                        }

                    }

                    return Transaction.abort();

                }


                @Override

                public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {

                    if(b) LogDelay.send("WIN");

                    else LogDelay.send("LOSE");

                }

            });


查看完整回答
反對 回復 2022-11-30
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

Realtime Database 和 Cloud Firestore 都沒有一種機制可以讓您在處理數據庫時強制鎖定整個數據庫,甚至只是鎖定其中的一部分任意時間。像這樣的東西在現實世界中根本無法擴展。

兩個數據庫都提供事務機制,這是唯一以原子方式和一致地執行讀寫的方法。如果您對某些其他形式的鎖定有絕對的要求,那么云托管數據庫可能不是您的最佳選擇。要么,要么您通過您控制的單個中間件匯集所有訪問權限,這也不會很好地擴展。


查看完整回答
反對 回復 2022-11-30
  • 3 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號