Не существует безопасного способа реализации условий между несколькими транзакциями.
Если обе операции зависят друг от друга, они должны выполняться как одна транзакция.Это означает, что у вас есть оптимистическая блокировка для всех «пользователей», но в вашей текущей структуре данных и необходимом решении.
Альтернативой является не обновлять баланс, а просто вести список транзакций.В этом случае вы можете убедиться, что как сложение для первого пользователя, так и вычитание для второго пользователя написаны атомарно с помощью многопозиционного обновления.В JavaScript это будет выглядеть примерно так:
ref = firebase.database().ref("users");
var updates = {};
let transactionID = ref.push().key;
updates["uid1/transactions/"+transactionID] = 20;
updates["uid2/transactions/"+transactionID] = -20;
ref.update(updates);
Вышеуказанная операция записи либо завершится успешно, либо завершится неудачей полностью.Это гарантирует, что ваша база данных всегда верна.