Я запускаю транзакцию для обновления 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());
}
}
});
}
}