使用 pg-promise 中断一个长事务

Interrupt a long transaction with pg-promise

我需要一种方法来拒绝此代码中的 pg-promise:

db.tx(async t => {
        var file = await t.one(`insert into ui.user_datasets_files (user_dataset_id,filename) values (${itemId},'${fileName}') RETURNING id`);
        var data = rows.map(row => {
            return {
                user_dataset_id: itemId,
                file_id: file.id,
                json_data: JSON.stringify(row)
            };
        });
        const insert = pgPromise.helpers.insert(data, dataset_data_columns);
        return t.none(insert);

}).then(() => callback()).catch(err => callback(err));

此行耗时较长,用户可以结束连接:

return t.none(insert);

所以,我想要一种方法来结束执行并在此事件中进行回滚:

 req.on('close', function () {
    promise.reject('Connection Closed');
});

Paginate/throttle 通过插入,并在每次插入之间检查事务是否需要中断,如果需要 - 抛出错误,事务将结束。

因此,例如,您可以执行 1000 行的 10 次插入,而不是在单次插入中插入 10,000 行。它的执行速度会稍微慢一点,但可以使您的事务在没有很大延迟的情况下可以中断。

您可以通过序列对数据进行分页,如 Data Imports 所示,或者如果所有数据都在内存中,则可以通过简单的循环进行分页。

in my code, all rows are in memory, how can i paginate the inserts?

db.tx(async t => {
    while(/* there is data */) {

        // get the next set of rows from memory;

        const insert = pgPromise.helpers.insert(data, dataset_data_columns);

        await t.none(insert)
            .then(() => {
               if(/* need to interrupt */) {
                   throw new Error('Interrupting transaction');
               }
            });
    }

}).then().catch();