Java/Android 中的 Firebase:事务被后续集合覆盖

Posted

技术标签:

【中文标题】Java/Android 中的 Firebase:事务被后续集合覆盖【英文标题】:Firebase in Java/Android: The transaction was overridden by a subsequent set 【发布时间】:2013-09-05 02:08:27 【问题描述】:

我使用 Firebase SDK for Java/android 的多人游戏有游戏室,可供 4 名玩家一起玩。

为了实现匹配,我为每个玩家可以加入的房间设置了一个 Firebase 参考。这些引用中的每一个都有 4 个插槽(作为子节点),其中包含正在参与的玩家的 UUID,如果插槽仍然可用,则包含一个空字符串。

为了防止两个(或更多)玩家同时占用同一个位置,我正在使用交易。以下代码是否适用于此目的?

private int mUserSlot;

firebaseReference.runTransaction(new Transaction.Handler() 

    @Override
    public Result doTransaction(MutableData currentData) 
        for (int s = 0; s <= 3; s++)  // loop through all slots
            final String slotValue = currentData.child(slotFromLocalID(s)).getValue(String.class);
            if (slotValue == null || slotValue.equals("") || slotValue.equals(mUserUUID))  // if slot is still available
                currentData.child(slotFromLocalID(s)).setValue(mUserUUID);
                mUserSlot = s;
                return Transaction.success(currentData);
            
        
        return Transaction.abort();
    

    @Override
    public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) 
        if (error == null) 
            if (committed) 
                System.out.println("User is now in slot "+mUserSlot);
            
            else 
                System.out.println("User could not join, all slots occupied");
            
        
        else 
            System.out.println("Error: "+error.getMessage());
        
    

);

但是,我在上面的onComplete()error != null 分支中抛出了一个Exception 进行调试,经过一些测试运行后,我可以看到以下错误消息(来自我的调试日志中的error.getMessage()

The transaction was overridden by a subsequent set

这到底是什么意思?我认为这些事务是为了防止同时访问相互覆盖的相同字段。这是否意味着应用程序的其他部分正在写入该字段没有事务?

在这种情况下,我可以像处理!committed 一样处理它吗?这意味着,在这两种情况下,事务完成后我想要写入的值都不存在,这是正确的吗?

【问题讨论】:

【参考方案1】:

是的,该消息意味着您的一个客户正在使用set 而不是transaction 写入同一位置,这会中止事务。我强烈建议不要在使用事务的位置使用set

【讨论】:

以上是关于Java/Android 中的 Firebase:事务被后续集合覆盖的主要内容,如果未能解决你的问题,请参考以下文章

JAVA Android Studio 不向 Firebase 实时数据库发送数据

Firebase 侦听器在 Java(Android) 中被阻止

Java Android 删除回收站中的项目大纲

Java Android Badge Drawable 在配置更改后无法正常工作

Firebase 云功能中的 Firebase 存储错误

javascript firebase中的firebase消息