Разбивайте / вставляйте через вставки, и между каждой вставкой проверяйте, нужно ли прервать транзакцию, и если да, то выдается ошибка, и транзакция заканчивается.
Так, например, вместо вставки 10000 строк в одну вставку, вы можете сделать 10 вставок из 1000 строк. Он будет выполняться чуть медленнее, но сделает вашу транзакцию прерываемой без большой задержки.
Вы можете разбивать данные на страницы либо через последовательность, как показано в Импорт данных , либо с помощью простого цикла, если все данные находятся в памяти.
в моем коде все строки находятся в памяти, как я могу разбить вставки на страницы?
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();