GCP节点js API中的事务提交使用扳手返回{“ code”:10,“ rowCounts”:[]}

时间:2019-11-20 17:30:23

标签: sql node.js transactions google-cloud-spanner

我有一个用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));
      }
  });
} 

2 个答案:

答案 0 :(得分:2)

{code:10}代表ABORTED [1]。我们的客户最好应该对此错误代码进行重试。我在nodejs客户端上提交了一个错误来跟踪此问题[3]。

在此期间,您可以简单地重试该请求,它应该成功。这里有重试中止交易的指南[2]

  1. https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
  2. https://googleapis.github.io/google-cloud-dotnet/docs/Google.Cloud.Spanner.Data/api/Google.Cloud.Spanner.V1.html#retrying-aborted-transactions
  3. https://github.com/googleapis/nodejs-spanner/issues/738

答案 1 :(得分:0)

您似乎在混用回调并在此处做出了一些承诺,如果我正确阅读了代码,则您的错误实际上源自batchUpdate。我不确定这是否是在回调运行程序中使用promise的副作用,但是您可以尝试像这样运行事务吗?

try {
  await database.runTransactionAsync(async transaction => {
    await transaction.batchUpdate(queries);
    return transaction.commit();
  });
} catch (e) {
  console.error(error);
}

如果您决定在runTransactionAsync函数中添加错误处理,则重要的是重新抛出您看到的所有已终止的错误,否则运行程序将不知道这些错误,并且不会触发重试。 / p>