【发布时间】:2016-05-29 00:04:11
【问题描述】:
我们使用 Firebase 作为我们移动应用的后端。我们的一些用户偶尔会收到错误“maxretry”,其中事务写入具有单个数值的路径。据我所知,我们没有多个用户或连接,也没有多次写入同一路径。这可能是什么原因造成的?
我怀疑这是由于使用了许多小数位的浮点值造成的。这个错误在我本地发生过一次,我能够通过将精度限制为小数点后两位来解决它。可以这样吗?
-阿尔伯特
编辑:
这是导致此问题的代码:
return fireRef.child(fbPath).transaction(function(originalVal) {
return func(originalVal, by_value);
}, _.noop, false)
在这种情况下,func 看起来像这样:
function(originalVal, val) {
return val + (originalVal || 0);
}
【问题讨论】:
-
没有看到重现此问题的代码,很难说比错误消息已经说的更多:事务重试次数过多。
-
函数运行了一百次,直到出现错误。没有对同一函数/同一路径进行其他调用(至少据我所知)。
originalVal类似于57.39999999999998和 val 类似于1.01。 -
鉴于 Firebase 事务是使用比较和交换运行的,浮点操作数可能是导致此问题的原因。如果是这种情况,解决方案是不使用浮点数,而是使用离散值和乘数,即
5740for57.40 -
拥有一个乘数并执行每个价值交易的价值本身听起来有点矫枉过正。您不认为仅以两位小数的精度存储就足够了吗?
-
我建议在这种情况下使用固定乘数。在处理金钱时,以“美分”存储所有东西是很常见的。我并不是说这是最好的方法(因为其他人可能不同意),但我向你保证这很常见。 :-)
标签: firebase firebase-realtime-database