我要使用Firebase实时数据库将点从用户转移到另一个,但为了避免冲突(可能用户同时从多个其他用户那里获得硬币),我不得不使用交易。
我的数据结构:
{
uid-1:
{
points: 30
},
uid-2:
{
points:60
}
}
所以我需要两个事务,一个减去uid-1,第二个增加uid-2
但是我担心,如果一项交易成功而另一项交易失败..是否有溶胶可以恢复操作或同时更新两者?
答案 0 :(得分:1)
没有安全的方法可以在多个事务之间实现条件。
如果两个操作都相互依赖,则应将它们作为单个事务运行。这意味着您可以乐观地锁定整个“用户”,但是需要当前的数据结构和解决方案。
另一种选择是不更新余额,而仅保留交易清单。在这种情况下,您可以确保通过使用多位置更新来原子地编写第一位用户的加法和第二位用户的减法。在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);
上述写操作将完全成功或完全失败。这样可以确保您的数据库始终正确。