如何优雅地停止Hana DB中长时间运行的事务



我使用的是来自https://www.npmjs.com/package/@sap/hana客户端本质上,我有一个需要很长时间的回调,所以我决定在Promise.race中并行运行它,以在1000ms后抛出错误(异步/等待中的超时(

这不会中断回调中当前正在运行的操作,但我希望在1000ms后到达catch块时回滚会终止它。不过,这种回滚似乎不起作用,它只是等待回调完成。这在相当长的一段时间内阻塞了我数据库中的一个表。

我的下一个想法是使用https://help.sap.com/viewer/f1b440ded6144a54ada97ff95dac7adf/2.12/en-US/b98b880fc6a344aa85ef0b471fa19af4.html然而,这似乎也没有打破长期回调。我做错什么了吗?

try {
db = await this.acquire();
db.connection.setAutoCommit(false);
const wrapper = new HanaClientAsyncWrapper(db);
await Promise.race([
callback(wrapper),
new Promise((_, reject) => setTimeout(
async () => {
reject(new Error("Timeout due to a long-running operation"));
// await db.abort(); <- does not work
}, 1000,
)),
]);
await db.commit();
} catch (err) {
if (db) {
await db.rollback();
}
throw err;
} finally {
if (db) {
db.connection.setAutoCommit(true);
await this.release(db);
}
}

在HANA中,执行期间停止活动语句可能会延迟。HANA中的内部任务管理是";合作社;从广义上讲,多任务处理方法。查询执行引擎的某些部分检查取消标志的频率不够高。通常情况下,如果更频繁地检查这样的标志会导致更高的性能成本,并且基线假设是而不是取消语句。

如果过多的运行时间导致锁定,进而导致实际的应用程序阻塞,那么考虑为这些语句使用工作负载管理类可能是一个不错的选择。有关详细信息,请参阅文档。

最新更新