Firebase 并发锁定/解锁写访问多个设备

我正在寻找一些关于如何在多个设备的 android 并发访问中锁定/解锁 firebase 写访问的提示

我希望能够做这样的事情:

  • 获得写入权限并锁定

  • 可运行进程 -> 从 firebase 获取一些数据,处理它

  • 可运行进程 -> 从之前的可运行进程中取回数据,将一些数据写入 firebase

  • 可运行进程 -> 从另一个可运行进程取回数据,获取另一个数据,处理它们

  • 可运行进程 -> 写入一些数据

  • 某某

  • 任务执行所有同步运行,将一堆数据写入 firebase

  • 解锁写访问

我的第一个想法是添加超时。如果您在提供允许的数量之前未解锁以确保没有设备可以阻止访问,则锁定写入可能会单独过期。

我阅读了 Transaction,但我认为它不适合我的需求。因为我在处理时需要访问多条路径。

任何人都知道如何实现设备在能够写入之前应该获得的锁定/解锁写入访问权限?

感谢您的任何想法。

PS:我的可运行同步任务已经完美地完成了工作,我只是在寻找如何锁定和解锁 firebase 的写访问权限,以确保在我处理一些数据时没有其他设备可以破坏数据。


慕斯709654
浏览 139回答 3
3回答

梦里花落0921

有一种方法在这里如何做:使用交易在您想要的路径上读取一个条目并锁定您想要的路径,条目是设备的 guid + 时间戳。如果时间戳 < 比你的,路径没有锁,你可以通过写你的 guid 和你的时间戳 + 你需要锁的时间来获取它。当交易成功时,你就是赢家,可以为所欲为。完成后,写入当前时间戳以释放锁

鸿蒙传说

如果有人需要它,这就是我在特定路径 3s 处构建和获取一把锁的方法。- 在每个表(路径),您可以关联一个包含此路径锁的 tableInfo。- 如果没有其他人需要锁,则获取、释放和延长时间。您可以使用尝试获取此锁的其他设备的 guid 在另一个字段上添加侦听器。并乐于释放它而不是延长你的时间。fbBase.child(tableInfoChildRef).child(TableInfo.Field.Lock.name).runTransaction(new Transaction.Handler() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public Map<String, Object> lock(){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Map<String, Object> data = new ArrayMap<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data.put(TableInfo.Field.Lock.guid, AppGUID.get().toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data.put(TableInfo.Field.Lock.timestamp, System.currentTimeMillis()+3000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return data;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @NonNull&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public Transaction.Result doTransaction(@NonNull MutableData mutableData) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(mutableData.getValue() == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mutableData.setValue(lock());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Transaction.success(mutableData);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Long lockTimestamp = mutableData.child(TableInfo.Field.Lock.timestamp).getValue(Long.class);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(lockTimestamp < System.currentTimeMillis()){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mutableData.setValue(lock());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Transaction.success(mutableData);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Transaction.abort();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(b) LogDelay.send("WIN");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else LogDelay.send("LOSE");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });

潇潇雨雨

Realtime Database 和 Cloud Firestore 都没有一种机制可以让您在处理数据库时强制锁定整个数据库,甚至只是锁定其中的一部分任意时间。像这样的东西在现实世界中根本无法扩展。两个数据库都提供事务机制,这是唯一以原子方式和一致地执行读写的方法。如果您对某些其他形式的锁定有绝对的要求,那么云托管数据库可能不是您的最佳选择。要么,要么您通过您控制的单个中间件汇集所有访问权限,这也不会很好地扩展。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java