使用firebase实时数据库,我想将点从用户移动到另一个用户,但为了避免冲突(可能用户同时从多个其他用户获得硬币),我必须使用事务。
我的数据结构:
{
uid-1:
{
points: 30
},
uid-2:
{
points:60
}
}所以我需要两个事务,一个减去uid-1,第二个增加uid-2
但我担心,如果一个交易成功,另一个交易失败..是否有解决方案可以恢复操作或同时更新这两个操作?
发布于 2019-03-04 00:51:57
没有安全的方法来实现多个事务之间的条件性。
如果这两个操作相互依赖,则它们应该作为单个事务运行。这意味着您对整个“用户”有一个乐观的锁,但在您当前的数据结构和解决方案中是必需的。
另一种选择是不更新余额,而只保留交易列表。在这种情况下,您可以使用多位置更新确保第一个用户的加法和第二个用户的减法都是原子写入的。在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);上述写入操作要么完全成功,要么完全失败。这将确保您的数据库始终正确。
https://stackoverflow.com/questions/54968467
复制相似问题