我正在运行一个事务来更新我的对象的likeCount。每个styleId
参数都保证是唯一的。当我喜欢这些物体的速度有点快时,我得到一个Firebase Database error: The transaction was overridden by a subsequent set
。事务被后续设置覆盖
public class LikeCountTransaction {
public static final String PATH = "styles/%s/likeInfo";
private final DatabaseReference databaseReference;
@Inject public LikeCountTransaction(DatabaseReference databaseReference) {
this.databaseReference = databaseReference;
}
public void execute(Long styleId) {
databaseReference.child(String.format(PATH, styleId)).runTransaction(new Transaction.Handler() {
@Override public Transaction.Result doTransaction(MutableData mutableData) {
MutableData likeCount = mutableData.child("likeCount");
Long likeCountValue = likeCount.getValue(Long.class);
if (likeCountValue != null) {
likeCount.setValue(likeCountValue + 1);
mutableData.child("likeModified").setValue(ServerValue.TIMESTAMP);
return Transaction.success(mutableData);
} else {
return Transaction.success(mutableData);
}
}
@Override public void onComplete(DatabaseError databaseError, boolean committed, DataSnapshot snapshot) {
if (committed) {
List<String> filterPaths = snapshot.child("filters").getValue(new GenericTypeIndicator<List<String>>() {
});
Long likeCount = snapshot.child("likeCount").getValue(Long.class);
Long likeModified = snapshot.child("likeModified").getValue(Long.class);
Map<String, Object> payload = new HashMap<>();
for (String path : filterPaths) {
payload.put(path.concat("/likeCount"), likeCount);
payload.put(path.concat("/likeModified"), likeModified);
}
databaseReference.updateChildren(payload);
} else {
if (databaseError != null)
Timber.e(databaseError.toException(), databaseError.getMessage());
}
}
});
}
}
您使用的是哪个版本的Firebase? –
@qbix验证和数据库:9.4.0 –
我能够重现错误,但不一致。你在每次测试中都得到它吗? –