Firebase RTDB批量事务(同时自增2个值)
Firebase RTDB batched transactions (increment 2 values at the same time)
我知道您可以使用 update 进行批量的、原子的全有或全无更新 - 但是您可以对事务做同样的事情吗?
目前我正在尝试在接受好友请求的同时增加用户好友数(2 个用户)。
这是我正在做的工作,但如果出现问题,将导致出现几次错误的数据不一致。
const upOneFriend = firebase
.database()
.ref("users")
.child(friend.uid)
.child("friendCount");
const upOneCurrentUser = firebase
.database()
.ref("users")
.child(userUid)
.child("friendCount");
upOneFriend
.transaction(currentCount => {
return currentCount + 1;
})
.then(() => {
upOneCurrentUser.transaction(currentCount2 => {
return currentCount2 + 1;
});
})
.catch(() => {
console.log("error increment");
});
就像我说的那样,这是有效的,但我需要同时做这件事!我环顾四周,没有发现任何与实时数据库的批处理事务相关的内容。
干杯。
Firebase 实时数据库中的事务在单个节点上工作。如果您需要更新事务中的多个节点,则需要 运行 在您要更新的节点之上的第一个公共节点上进行事务。在您的场景中,这意味着您 运行 跨越 users
的事务,这可能会显着降低吞吐量。
另一种方法是使用多位置更新。但是由于多位置更新不会自动防止并发写入,因此您必须在写入本身中包含防止并发写入的信息。
有关此示例,请在此处查看我的回答:, and How to update multiple children under child node using a transaction?
我知道您可以使用 update 进行批量的、原子的全有或全无更新 - 但是您可以对事务做同样的事情吗?
目前我正在尝试在接受好友请求的同时增加用户好友数(2 个用户)。
这是我正在做的工作,但如果出现问题,将导致出现几次错误的数据不一致。
const upOneFriend = firebase
.database()
.ref("users")
.child(friend.uid)
.child("friendCount");
const upOneCurrentUser = firebase
.database()
.ref("users")
.child(userUid)
.child("friendCount");
upOneFriend
.transaction(currentCount => {
return currentCount + 1;
})
.then(() => {
upOneCurrentUser.transaction(currentCount2 => {
return currentCount2 + 1;
});
})
.catch(() => {
console.log("error increment");
});
就像我说的那样,这是有效的,但我需要同时做这件事!我环顾四周,没有发现任何与实时数据库的批处理事务相关的内容。
干杯。
Firebase 实时数据库中的事务在单个节点上工作。如果您需要更新事务中的多个节点,则需要 运行 在您要更新的节点之上的第一个公共节点上进行事务。在您的场景中,这意味着您 运行 跨越 users
的事务,这可能会显着降低吞吐量。
另一种方法是使用多位置更新。但是由于多位置更新不会自动防止并发写入,因此您必须在写入本身中包含防止并发写入的信息。
有关此示例,请在此处查看我的回答: