所以我需要在数据存储中更新值。我正在使用事务这样做,如下所示。提交更新后,我将结果发送回客户端,让他们知道更新已完成。然后,客户端发送另一个请求以获取更新的项目列表。据我所知,所有代码都正确执行,没有抛出任何错误,最终我确实得到了按预期显示的更新请求。
我的问题是,即使在提交之后,有时也需要几秒钟的时间才能在返回的列表中显示更新。如果只是延迟那就太糟糕了,但比这更糟糕。该列表在此时间段内返回不正确/未更新的值。我知道这种架构可能会出现延迟,但我认为交易的全部意义在于,如果像这样更新某些内容,那么一旦交易获取所需的项目,就不可能读取旧值了?事后很长一段时间看到旧值似乎是不正确的。更不用说等到事务表示它已提交并且具有整个 300ms+ RTT 后,并且在据称提交后的几秒钟内仍然获得错误值。我在这里缺少什么?
/*
We don't actually delete a post, we simply replace it with a [removed]
version of itself.
*/
router.delete('/', function (req, res) {
//Check our parameters
if (req.body == null || req.body["Thread"] == null || typeof req.body["Thread"] !== "string") {
res.json({ success: false, message: "Thread name was not included as a parameter.", data: null});
return;
}
if (req.body == null || req.body["PostNumber"] == null) {
res.json({ success: false, message: "Post Number was not included as a parameter.", data: null });
return;
}
if ((parseInt(req.body["PostNumber"]) || 0) < 1) {
res.json({ success: false, message: "Post Number was not a valid numeric value.", data: null });
return;
}
var transaction = datastore.transaction();
transaction.get(datastore.key(['Post', PostName(req.body["Thread"], 6, parseInt(req.body["PostNumber"]))]), function (err, value) {
if (err)
{
res.json({ success: false, message: "Transaction failed.", data: null });
return;
}
if (value === null)
{
res.json({ success: false, message: "Post and thread combination does not exist.", data: null });
return;
}
value.data.CreatorName = "[removed]";
value.data.CreatorFooter = "";
value.data.Contents = "[removed]";
transaction.save(value);
transaction.commit(function (err) {
if (err)
{
res.json({ success: false, message: "Transaction failed.", data: null });
}
else
{
res.json({ success: true, message: "Erased post information from table", data: null });
}
});
});
});