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) 中被阻止