BadRequestException:没有打开的事务,qldb,nodejs 驱动程序
BadRequestException: no open transaction, qldb, nodejs driver
我用 qldb 设置我的 nodejs 应用程序来实现钱包服务。使用一些成功测试和一些预期错误测试设置一些测试,偶尔会发生此错误 'BadRequestException: no open transaction' 并导致我的测试失败。如果我运行再测试一次,他们就会通过。又一次,这个错误会意外地发生,导致测试失败。我在注释掉我预期的错误测试时注意到错误没有发生或没有经常发生。这个错误不仅发生在预期的错误测试中,而且发生在成功的测试中。
这就是我的测试结果
describe('createWallet()', () => {
it('should return an object with wallet Id', async () => {
let result6 = await controller.createWallet({ body: mocks.walletInfo6.info });
documentId6 = result6.walletId;
expect(result6).to.have.property('walletId').that.is.a.uuid;
});
it('One player should have only one active wallet for each currency', async () => {
try {
let res = await controller.createWallet({ body: mocks.walletInfo1.info });
assert.fail('expected error was not thrown')
} catch (e) {
expect(e.message).to.equal('Player already owns an active wallet in this currency.');
}
});
});
describe('suspendWallet()', () => {
it('should change wallet status to suspend', async () => {
let res = await controller.suspendWallet({ documentId: documentId3 });
await controller.suspendWallet({ documentId: documentId5 });
expect(res).to.be.a.string;
expect(res).to.equal(documentId3);
});
it('should not change wallet status if wallet Id is invalid', async () => {
try {
let res = await controller.suspendWallet({ documentId: mocks.invalidWalletId });
assert.fail('expected error was not thrown')
} catch (e) {
expect(e.message).to.equal('Did not find any record with this document Id.');
}
});
});
关于这个问题的更新。我使用 nodejs 驱动程序版本 2.1.0。
我和我的团队发现问题是因为在错误测试之后发生了回滚,而我们不知道回滚何时完成。当上一个测试的回滚仍然是 运行 时,那个测试的事务仍然是打开的,所以如果下一个测试试图打开一个新的事务,它会发生冲突并且不能为下一个测试打开一个新的事务.为了解决这个问题,我们只是不在事务中抛出错误以防止回滚发生。这种方式适用于我们的代码,但更好的解决方案是检测驱动程序何时完成回滚并等待事务关闭,然后再打开新事务。
如果不查看驱动程序是如何用于执行事务的,则很难确定您的应用程序是如何 运行 陷入此错误的。
驱动程序 API(例如 - execute)returns 一个承诺。应用程序可能会看到“无事务打开错误”的一种方式是在发送进一步的命令之前未解决承诺。
Cookbook - 请参阅 QLDB JS 驱动程序 cookbook,其中列出了 CRUD 操作的代码示例。请注意示例如何在事务中使用 await 来等待承诺解决。不等待执行返回的承诺可能导致驱动程序在处理执行调用之前提交事务,因此出现“无打开事务错误”。
执行交易的示例代码-
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");
});
})();
如果您仍然遇到问题,请分享您使用驱动程序执行交易的代码片段。
我用 qldb 设置我的 nodejs 应用程序来实现钱包服务。使用一些成功测试和一些预期错误测试设置一些测试,偶尔会发生此错误 'BadRequestException: no open transaction' 并导致我的测试失败。如果我运行再测试一次,他们就会通过。又一次,这个错误会意外地发生,导致测试失败。我在注释掉我预期的错误测试时注意到错误没有发生或没有经常发生。这个错误不仅发生在预期的错误测试中,而且发生在成功的测试中。 这就是我的测试结果
describe('createWallet()', () => {
it('should return an object with wallet Id', async () => {
let result6 = await controller.createWallet({ body: mocks.walletInfo6.info });
documentId6 = result6.walletId;
expect(result6).to.have.property('walletId').that.is.a.uuid;
});
it('One player should have only one active wallet for each currency', async () => {
try {
let res = await controller.createWallet({ body: mocks.walletInfo1.info });
assert.fail('expected error was not thrown')
} catch (e) {
expect(e.message).to.equal('Player already owns an active wallet in this currency.');
}
});
});
describe('suspendWallet()', () => {
it('should change wallet status to suspend', async () => {
let res = await controller.suspendWallet({ documentId: documentId3 });
await controller.suspendWallet({ documentId: documentId5 });
expect(res).to.be.a.string;
expect(res).to.equal(documentId3);
});
it('should not change wallet status if wallet Id is invalid', async () => {
try {
let res = await controller.suspendWallet({ documentId: mocks.invalidWalletId });
assert.fail('expected error was not thrown')
} catch (e) {
expect(e.message).to.equal('Did not find any record with this document Id.');
}
});
});
关于这个问题的更新。我使用 nodejs 驱动程序版本 2.1.0。 我和我的团队发现问题是因为在错误测试之后发生了回滚,而我们不知道回滚何时完成。当上一个测试的回滚仍然是 运行 时,那个测试的事务仍然是打开的,所以如果下一个测试试图打开一个新的事务,它会发生冲突并且不能为下一个测试打开一个新的事务.为了解决这个问题,我们只是不在事务中抛出错误以防止回滚发生。这种方式适用于我们的代码,但更好的解决方案是检测驱动程序何时完成回滚并等待事务关闭,然后再打开新事务。
如果不查看驱动程序是如何用于执行事务的,则很难确定您的应用程序是如何 运行 陷入此错误的。
驱动程序 API(例如 - execute)returns 一个承诺。应用程序可能会看到“无事务打开错误”的一种方式是在发送进一步的命令之前未解决承诺。
Cookbook - 请参阅 QLDB JS 驱动程序 cookbook,其中列出了 CRUD 操作的代码示例。请注意示例如何在事务中使用 await 来等待承诺解决。不等待执行返回的承诺可能导致驱动程序在处理执行调用之前提交事务,因此出现“无打开事务错误”。
执行交易的示例代码-
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");
});
})();
如果您仍然遇到问题,请分享您使用驱动程序执行交易的代码片段。