【发布时间】:2022-01-23 15:33:07
【问题描述】:
我有一个结构如下的数据库:
现在可以对两幅画作进行评分,然后评分会更新。 但可能会发生一幅画同时被多次评级的情况。因此我尝试使用嵌套事务(见下文)来避免竞争条件:
function pictureClicked(picture) {
const db = getDatabase();
const leftRef = ref(db, '/paintings/' + generateDbName(currentLeft));
const rightRef = ref(db, '/paintings/' + generateDbName(currentRight));
const winnerLeft = (picture === 'left') ? 1 : 0;
runTransaction(leftRef, (leftP) => {
if (leftP) {
runTransaction(rightRef, (rightP) => {
if (rightP) {
// Calculation of the new rating for each painting (Elo System)
const tRatingLeft = Math.pow(10, leftP.rating / 400);
const tRatingRight = Math.pow(10, rightP.rating / 400);
const expectedLeft = tRatingLeft / (tRatingLeft + tRatingRight);
const expectedRight = tRatingRight / (tRatingLeft + tRatingRight);
// Setting new rating
leftP.rating = leftP.rating + 32 * (winnerLeft - expectedLeft);
rightP.rating = rightP.rating + 32 * ((1 - winnerLeft) - expectedRight);
}
return rightP;
});
}
return leftP;
});
}
现在这个解决方案并没有真正起作用,我已经读到它不是解决这个问题的最佳方法。我找到的唯一解决方案是在我的数据库的根目录上运行一个事务,但我担心这会导致瓶颈并且许多启动的事务甚至不会写入数据库,因为事务只重试了 25 次(或我在这里的恐惧是没有根据的吗?)。这个问题还有其他解决方案吗?
【问题讨论】:
标签: javascript firebase firebase-realtime-database