使用pg-promise中断长事务

时间:2018-05-15 09:01:27

标签: javascript pg-promise

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

return t.none(insert);

此行需要很长时间,用户可以结束连接:

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

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

{{1}}

1 个答案:

答案 0 :(得分:1)

通过插入进行分页/限制,并在每个插入之间检查是否需要中断事务,如果是,则抛出错误,事务将结束。

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

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

  

在我的代码中,所有行都在内存中,我如何对插入进行分页?

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();