为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号