所以我有需要在我的数据存储中更新的值。我正在使用事务,如下所示。提交更新后,我将结果发送回客户端,让他们知道更新已经完成。然后,客户端发送另一个请求以获取更新的项目列表。据我所知,所有代码都正确执行,没有抛出错误,最终我得到了按预期显示的更新请求。
我的问题是即使在提交之后有时也会在更新显示在返回列表中之前几秒钟。如果只是延迟,那将是糟糕的,但比这更糟糕。该列表在此时间段内返回不正确/未更新的值。我知道这种架构可能会有延迟,但我认为交易的全部意义在于,如果像这样更新某些东西,一旦交易抓住了所需的项目,就没有什么可能读取旧值了?事后长时间查看旧值似乎是不正确的。更不用说等到事务说它已经提交并且有一个完整的 300 毫秒 + 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 });
}
});
});
});