Nano Hash - криптовалюты, майнинг, программирование

Транзакция была отменена последующим набором

Я запускаю транзакцию для обновления 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 вы используете? 20.09.2016
  • @qbix аутентификация и база данных: 9.4.0 20.09.2016
  • Я могу воспроизвести ошибку, но не последовательно. Вы получаете это на каждом тесте? 21.09.2016
  • Да, я могу воспроизвести это последовательно 21.09.2016

Ответы:


1

Основываясь на моих экспериментах с опубликованным вами кодом, я совершенно уверен, что проблема вызвана этим утверждением:

databaseReference.updateChildren(payload);

Хотя это обновление не изменяет ни одного из дочерних элементов, измененных в doTransaction(), оно изменяет то же родительское расположение, databaseReference. По-видимому, обработка транзакций Firebase рассматривает обновление любого дочернего элемента как изменение местоположения, что делает транзакцию недействительной.

Чтобы убедиться в этом, закомментируйте оператор updateChildren() и запустите тест. Когда я это сделал, ошибка не возникла.

21.09.2016
  • Я делаю многопутевые обновления более конкретно для ближайшей общей родительской ссылки, а не для корневой ссылки базы данных, которая решила проблему. 21.09.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..