gpt4 book ai didi

java - Java/Android 中的 Firebase : The transaction was overridden by a subsequent set

转载 作者:行者123 更新时间:2023-11-29 05:38:37 25 4
gpt4 key购买 nike

我使用 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 那样处理吗?这意味着,在这两种情况下,我想要写入的值在交易完成后不存在,这是正确的吗?

最佳答案

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

关于java - Java/Android 中的 Firebase : The transaction was overridden by a subsequent set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com