我有一个用nodejs为GCP编写的API。在日志中,有时API对于前两个事务返回{“ code”:10,“ rowCounts”:[]},但所有其他事务都可以正常工作。
除了{“ code”:10,“ rowCounts”:[]}外,错误中没有其他详细信息。
但是,如果我尝试将此查询直接运行到扳手中。查询正在执行,没有错误。
我有以下交易代码:
database.runTransaction(async (err, transaction) => {
if (queries.length != 0) {
try {
await transaction.batchUpdate(queries);
transaction.commit(function(err) {
if (!err) {
console.log('transaction commited');
});
} catch (error) {
//I get the error here in transaction commit.
console.log(JSON.stringify(error));
return callback(some code);
}
}catch (error) {
console.log(JSON.stringify(error));
}
});
}
答案 0 :(得分:2)
{code:10}代表ABORTED [1]。我们的客户最好应该对此错误代码进行重试。我在nodejs客户端上提交了一个错误来跟踪此问题[3]。
在此期间,您可以简单地重试该请求,它应该成功。这里有重试中止交易的指南[2]
答案 1 :(得分:0)
您似乎在混用回调并在此处做出了一些承诺,如果我正确阅读了代码,则您的错误实际上源自batchUpdate
。我不确定这是否是在回调运行程序中使用promise的副作用,但是您可以尝试像这样运行事务吗?
try {
await database.runTransactionAsync(async transaction => {
await transaction.batchUpdate(queries);
return transaction.commit();
});
} catch (e) {
console.error(error);
}
如果您决定在runTransactionAsync
函数中添加错误处理,则重要的是重新抛出您看到的所有已终止的错误,否则运行程序将不知道这些错误,并且不会触发重试。 / p>