问题描述
我使用 qldb 设置了我的 nodejs 应用程序以实现钱包服务。使用一些成功测试和一些预期的错误测试设置一些测试,偶尔会发生此错误“BadRequestException:没有打开的事务”并导致我的测试失败。如果我再次运行测试,它们将通过。偶尔,此错误会意外发生,导致测试失败。当注释掉我预期的错误测试时,我注意到错误没有发生或没有经常发生。这个错误不仅发生在预期的错误测试中,而且发生在成功的测试中。 这就是我的测试的样子
@CucumberOptions(features = "features/test",glue="com.automation.cucumber",tags = "@test",plugin = {"json:target/cucumber/report.json","html:target/cucumber/report.html"})
public class CucumberTestRunner {
}
解决方法
关于这个问题的更新。我使用 nodejs 驱动程序版本 2.1.0。 我和我的团队发现问题是因为在错误测试之后发生了回滚,而我们不知道回滚何时完成。当前一个测试的回滚仍在运行时,该测试的事务仍处于打开状态,因此如果下一个测试尝试打开一个新事务,它将发生冲突,并且无法为下一个测试打开一个新事务。为了解决这个问题,我们只是不在事务中抛出错误以防止发生回滚。这种方式适用于我们的代码,但更好的解决方案是检测何时从驱动程序完成回滚并在打开新事务之前等待事务关闭。
,如果不查看驱动程序如何用于执行事务,就很难确定您的应用程序是如何遇到此错误的。
驱动程序 API(例如 - execute )返回一个承诺。应用程序看到“无事务打开错误”的一种方式是在发送进一步命令之前未解决承诺。
Cookbook - 请参阅 QLDB JS 驱动程序 cookbook,其中列出了 CRUD 操作的代码示例。请注意示例如何在事务中使用 await 来等待承诺解决。不等待 execute 返回的 promise 会导致驱动程序在处理 execute 调用之前提交事务,从而导致“无打开事务错误”。
执行交易的示例代码 -
var qldb = require('amazon-qldb-driver-nodejs');
const qldbDriver = new qldb.QldbDriver("vehicle-registration");
(async function() {
await qldbDriver.executeLambda(async (txn) => {
await txn.execute("CREATE TABLE Person");
});
})();
如果您仍然遇到问题,请分享您使用驱动程序执行交易的代码片段。